2016-07-27 19 views
5

Çeşitli resimleri indirmek için Picasso kullanıyorum. Genellikle, bunları bir ImageView içinde görüntülüyorum, ancak bu durumda, önbelleğe geri başvurmak veya yeniden indirmek zorunda kalmadan bunları farklı yerlerde kullanabilmem için onlara güçlü bir başvuru yapmak istiyorum. Ben olsunPicasso Target to Image Hedefe git

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

Her durumda: - Burada ki (ben sadece bu soruya alakalı bölümlerine indirdim ettik bu sınıfa fazlası var olduğuna dikkat edin) çalışırken yapmak nasıl çıktı: başka

on prepare load

ama hiçbir şey. Simgem her zaman boş. Bunu, getIcon()'u aradığım diğer sınıflardan biliyorum.

Burada nelerin eksik? Herhangi bir yardım için teşekkürler.

cevap

6

Picasso, Target örneğini zayıf bir referansla saklar, yani Target toplayıcınız toplanmış gibi görünüyor.
bkz: https://github.com/square/picasso/issues/352

Bir örnek alan olarak Target tutmak daha iyidir.

public class MapLayer { 

    ... 

    private Target target; 

    private void downloadIcon() { 

     ... 

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

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

Yapmam gereken tek şey bu. Çok teşekkürler! – Alex

2

Onun Picasso sadece Target nesneye zayıf başvuru tutar çünkü.

Güçlü bir referansa sahip olmak istiyorsanız Target ürününü View ürününe etiketlemenizi öneririz.
Here is a solution for your problem.

+0

Teşekkürler. Bu gönderiyi görmüştüm, ancak anahtarın sadece 'Target' referansını bir örnek değişkenine yükseltmek olduğunu fark etmemişti. Şimdi biliyorum. Tekrar teşekkürler! – Alex