2014-12-16 20 views
11

Sto tentando di cancellare la memoria cache di Picasso tramite codifica Android.Memoria cache chiara di Picasso

Qualcuno può aiutarmi per favore in questo numero ..?

Ho provato con il seguente codice, ma questo non era utile nel mio caso:

Picasso.with(getActivity()).load(data.get(pos).getFeed_thumb_image()).skipMemoryCache().into(image); 
+0

non hanno ancora testato, ma, 'Picasso.with (contesto) .shutdown()' può essere utile immagino. – activesince93

risposta

3

se si sta tentando di caricare un'immagine tramite Json (da db) provare a cancellare il networkCache per un risultato migliore.

Picasso.with(context).load(uri).networkPolicy(NetworkPolicy.NO_CACHE) 
     .memoryPolicy(MemoryPolicy.NO_CACHE) 
     .placeholder(R.drawable.bv_logo_default).stableKey(id) 
     .into(viewImage_imageView); 
+0

Che cosa facciamo per impostazione predefinita per quelli di noi che stanno astraggono Picasso? L'immagine –

+0

richiede molto tempo per essere caricata –

8

di cache Rimuovere di Picasso come questo.

public class Clear { 

    public static void clearCache (Picasso p) { 
     p.cache.clear(); 
    } 
} 

Questa classe di util può cancellare la cache per voi. Non vi resta che chiamare:

Clear.clearCache(Picasso.with(context)); 

EDIT:
La classe libera deve essere nel pacchetto:

package com.squareup.picasso; 

Perché cache non è accessibile dall'esterno quel pacchetto. Come in questa risposta: https://stackoverflow.com/a/23544650/4585226

+1

Grazie per la risposta. Genera errore per modificare il metodo come non statico o modificare la classe come statica. Dice anche che la "cache" non è visibile nella riga seguente: p.cache.clear(); –

+0

dovrebbe funzionare. Stiamo chiamando metodo statico di una classe pubblica. –

+2

Sto usando solo il barattolo Picasso e non sto usando alcuna libreria Picasso esterna. E dice che "p.cache" è invisibile. –

0

se si mantiene di riferimento del vostro customDownloader implementazione è possibile cancellare la cache.

public class PicassoUtil { 
    private static Picasso sInstance; 
    private static OkHttp22Downloader sDownloader; 
    public static Picasso getPicasso(Context context){ 
     if(sInstance == null) { 
      sDownloader = new OkHttp22Downloader(context) 
      Picasso.Builder builder = new Picasso.Builder(context); 
      builder.downloader(sDownloader); 
      sInstance = builder.build(sDownloader); 
     } 
     return sInstance; 
    } 
    public static void clearCache(){ 
     if(sDownloader != null){ 
     sDownloader.clearCache(); 
     } 
    } 
} 

E 'importante avere accesso al vostro client HTTP e il suo Cache. Nella mia implementazione c'è l'accesso alla cache, cancellando quindi la cache con il metodo clearCache().

29

Utilizzare questo invece:

Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image); 
+0

Non ha funzionato per me. Quindi ho aggiunto anche .networkpolicy (NetworkPolicy.NO_CACHE). Quindi ha funzionato. – karan

+0

che dire se vuoi mettere in cache tutte le immagini per un po 'di tempo, ma poi svuota tutta la cache quando non ne ho più bisogno? – user924

4

Quando l'attività distrugge, purtroppo bitmap non era riciclato se stiamo usando Picasso. Provo a riciclare a livello di codice bitmap, cosa viene caricato nella vista immagine. C'è un modo per fare riferimento alla bitmap caricata usando Target.

Target mBackgroundTarget = new Target() { 
     Bitmap mBitmap; 

     @Override 
     public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
      if (bitmap == null || bitmap.isRecycled()) 
       return; 

      mBitmap = bitmap; 
      mBgImage.setImageBitmap(bitmap); 
      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        // Do some animation 
       } 
      }); 
     } 

     @Override 
     public void onBitmapFailed(Drawable errorDrawable) { 
      recycle(); 
     } 

     @Override 
     public void onPrepareLoad(Drawable placeHolderDrawable) { 

     } 

     /** 
     * Recycle bitmap to free memory 
     */ 
     private void recycle() { 
      if (mBitmap != null && !mBitmap.isRecycled()) { 
       mBitmap.recycle(); 
       mBitmap = null; 
       System.gc(); 
      } 
     } 
    }; 

E quando Attività distruggere, io chiamo onBitmapFailed(null) riciclare bitmap caricata.

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    try { 
     if (mBackgroundTarget != null) { 
      mBackgroundTarget.onBitmapFailed(null); 
      Picasso.with(context).cancelRequest(mBackgroundTarget); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Ma ricordate, non cache immagini in memoria da questo caso, causerà Usa riciclata eccezione bitmap.

Picasso.with(context) 
      .load(imageUrl) 
      .resize(width, height) 
      .memoryPolicy(MemoryPolicy.NO_CACHE) 
      .into(mBackgroundTarget); 

Spero che questo aiuto.

0

ho avuto lo stesso problema. Ha funzionato per me. Ho usato Picasso in RecycleView all'interno di una finestra di dialogo. Quando ho chiuso il dialogo, Picasso non cancella la cache. Ma mentre si sta utilizzando la finestra di dialogo cancella la cache di immagini. Tuttavia c'è qualche cache che non è stata cancellata. Forse la cache che non è stata cancellata è l'ultima che hai visto nella finestra di dialogo prima di dialog.dismiss().

uso questo memoryPolicy (MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)

Picasso.with(activity).load(file).resize(100,100).centerCrop().memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE).into(contactImage, new com.squareup.picasso.Callback() { 
       @Override 
       public void onSuccess() { 

       } 

       @Override 
       public void onError() { 

       } 
      }); 
0
Picasso.with(this.getContext()).load(gamePlayer.getPlayerProfileUrl()).skipMemoryCache().into(iv); 

questo funziona anche

1

Invece di pulire la cache completa se si vuole aggiornare l'immagine con la data Uri. prova questo Picasso.with(context).invalidate(uri); rimuove internamente la chiave dalla cache gestita da Picasso.

Estratto dal Picasso.java /** * Invalidate all memory cached images for the specified {@code uri}. * * @see #invalidate(String) * @see #invalidate(File) */ public void invalidate(Uri uri) { if (uri == null) { throw new IllegalArgumentException("uri == null"); } cache.clearKeyUri(uri.toString()); }

Problemi correlati