2014-12-16 7 views
11

Ich versuche, den Cache-Speicher von Picasso über Android-Codierung zu löschen.Clear Cache-Speicher von Picasso

Kann mir bitte jemand in dieser Ausgabe helfen ..?

Ich habe versucht, den folgenden Code verwenden, aber das war in meinem Fall nicht sinnvoll:

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

Haben noch nicht getestet, aber 'Picasso.with (Kontext) .shutdown()' kann hilfreich sein, denke ich. – activesince93

Antwort

3

Wenn Sie versuchen, ein Bild über Json (von db) zu laden, löschen Sie den networkCache für ein besseres Ergebnis.

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

Was machen wir als Standard für diejenigen von uns, die Picasso abstrahieren? –

+0

Bild dauert lange Zeit zu laden –

8

Entfernen Cache von Picasso so.

public class Clear { 

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

Diese Util-Klasse kann den Cache für Sie löschen. Sie müssen es nur nennen:

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

EDIT:

package com.squareup.picasso; 

Da Cache von außerhalb dieses Paket nicht zugänglich ist:
Die Klasse Klar im Paket sein muss. Wie in dieser Antwort: https://stackoverflow.com/a/23544650/4585226

+1

Danke für Ihre Antwort. Es wird ein Fehler ausgegeben, um die Methode als nicht statisch zu ändern oder die Klasse als statisch zu ändern. Außerdem heißt es, dass der "Cache" in der folgenden Zeile nicht sichtbar ist: p.cache.clear(); –

+0

sollte es funktionieren. Wir rufen die statische Methode einer öffentlichen Klasse auf. –

+2

Ich benutze nur das Picasso-Glas und verwende keine externen Picasso-Bibliotheken. Und es sagt, dass "p.cache" unsichtbar ist. –

0

Wenn Sie halten Referenz Ihrer customDownloader Implementierung Sie Cache löschen.

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(); 
     } 
    } 
} 

Es ist wichtig, den Zugriff auf Ihren HTTP-Client und seine Cache zu haben. In meiner Implementierung gibt es Zugriff auf den Cache und damit Cache mit clearCache() Methode zu löschen.

29

Verwenden Sie stattdessen:

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

Hat bei mir nicht funktioniert. Daher habe ich auch .Networkpolicy (NetworkPolicy.NO_CACHE) hinzugefügt. Dann hat nur geklappt. – karan

+0

Was ist, wenn Sie alle Bilder für einige Zeit zwischenspeichern möchten, aber dann löschen Sie alle Cache, wenn ich es nicht mehr brauche? – user924

4

Wenn Aktivität zerstören, wurde leider Bitmap nicht recycelt, wenn wir Picasso verwenden. Ich versuche, Bitmap programmgesteuert zu recyceln, was in Bildansicht geladen wird. Es gibt eine Möglichkeit, auf geladene Bitmap zu verweisen, indem Sie verwenden.

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(); 
      } 
     } 
    }; 

Und wenn Aktivität zerstören, nenne ich onBitmapFailed(null) geladen Bitmap zu recyceln.

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

Aber denken Sie daran, nicht zwischenspeichern IMAGE IN MEMORY von diesem Fall wird es verwenden Recycling-Bitmap Ausnahme verursachen.

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

Hoffe diese Hilfe.

0

Ich hatte das gleiche Problem. Es funktionierte für mich. Ich verwendete Picasso in RecycleView in einem Dialogfeld. Wenn ich den Dialog schloss, löschte Picasso den Cache nicht. Aber während Sie den Dialog verwenden, löscht es Bildcache. Es gibt jedoch einen Cache, der nicht gelöscht wird. Vielleicht ist der Cache, der nicht gelöscht wurde, der letzte, den Sie im Dialog vor dialog.dismiss() gesehen haben.

Verwendung dieses 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); 

Dies funktioniert auch

1

Statt den gesamten Cache des Löschens, wenn man das Bild mit dem angegebenen auffrischen will Uri. versuchen Sie diese Picasso.with(context).invalidate(uri); es entfernt den Schlüssel intern aus dem Cache von Picasso verwaltet.

Auszug aus 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()); }