2016-07-27 83 views
5

我正在使用畢加索下載各種圖像。通常,我只是在ImageView中顯示這​​些內容,但在這種情況下,我希望對它們進行強有力的參考,以便我可以在不同的地方使用它們,而無需返回緩存或重新下載它們。這裏是我在嘗試做(注意,有更多這一類 - 我只是把範圍縮小到有關這個問題的部分):畢加索將圖像加載到目標中

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

在任何情況下,我得到輸出:

on prepare load

,但沒有別的。我的圖標始終爲空。我從其他職業我知道這個,我叫getIcon()

我在這裏錯過了什麼?謝謝你的幫助。

回答

6

畢加索持有Target實例與弱引用,所以你的Target似乎是垃圾收集。
請參閱:https://github.com/square/picasso/issues/352

最好將Target作爲實例字段。

public class MapLayer { 

    ... 

    private Target target; 

    private void downloadIcon() { 

     ... 

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

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

這就是我需要做的。非常感謝! – Alex

2

它是因爲畢加索只保留對Target對象的弱引用。

如果你想有一個強有力的參考,我建議標記TargetView
Here is a solution for your problem

+0

謝謝。我曾看過那篇文章,但並沒有意識到關鍵只是將'Target'引用提升爲一個實例變量。現在我明白了。再次感謝! – Alex