2016-07-27 13 views
5

Ich benutze Picasso, um verschiedene Bilder herunterzuladen. Normalerweise zeige ich diese nur in einer ImageView an, aber in dieser Situation möchte ich eine starke Referenz zu ihnen halten, so dass ich sie an verschiedenen Orten verwenden kann, ohne auf den Cache zurückgreifen oder sie erneut herunterladen zu müssen. Hier ist, wie ich versuche, das zu tun (beachten Sie, dass es mehr zu dieser Klasse ist - ich habe nur verengt es auf die Teile nach unten, die auf diese Frage relevant sind):Picasso Bild in Ziel laden

public class MapLayer { 

    private Context mContext; 
    private String mType; 
    private Drawable mIcon = null; 

    public MapLayer (Context context, String type) { 
     mContext = context; 
     mType = type; 
     downloadIcon(); 
    } 

    public Drawable getIcon() {return mIcon;} 

    private void downloadIcon() { 

     String url = mContext.getString(R.string.maps_icon_url).replace("${type}", mType)); 

     Target target = new Target() { 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
       Log.d(TAG, "on bitmap loaded"); 
       mIcon = new BitmapDrawable(mContext.getResources(), bitmap); 
      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 
       Log.d(TAG, "on bitmap failed"); 
      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 
       Log.d(TAG, "on prepare load"); 
       mIcon = placeHolderDrawable; 
      } 
     }; 

     ImageDownloader.getSharedInstance().load(url).into(target); 
    } 
} 

In jedem Fall ich die Ausgabe:

on prepare load

aber sonst nichts. Mein Symbol ist immer Null. Ich kenne das aus anderen Klassen, wo ich getIcon() anrufen.

Was fehlt mir hier? Danke für jede Hilfe.

Antwort

6

Picasso hält Target Instanz mit einer schwachen Referenz, So scheint Ihre Target Müll gesammelt werden.
siehe: https://github.com/square/picasso/issues/352

Es ist besser, Target als ein Instanzfeld zu halten.

public class MapLayer { 

    ... 

    private Target target; 

    private void downloadIcon() { 

     ... 

     target = new Target() { 
      ... 
     }; 

     ImageDownloader.getSharedInstance().load(url).into(target); 
    } 
} 
+0

Das war alles was ich tun musste. Danke vielmals! – Alex

2

Es ist, weil Picasso nur eine schwache Referenz auf das Objekt Target hält.

Wenn Sie eine starke Referenz haben möchten, würde ich empfehlen, die Target an die View zu markieren.
Here is a solution for your problem.

+0

Danke. Ich hatte diesen Post gesehen, aber nicht bemerkt, dass der Schlüssel nur darin bestand, den 'Target'-Bezug auf eine Instanzvariable zu fördern. Jetzt weiß ich. Danke noch einmal! – Alex