在第一次加載時未調用的Target對象的onBitmapLoaded在我的功能:public void getPointMarkerFromUrl(final String url, final OnBitmapDescriptorRetrievedListener listener) {final int maxSize = context.getResources().getDimensionPixelSize(R.dimen.icon_max_size);Target t = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if (bitmap != null)
listener.bitmapRetrieved(getBitmapDescriptorInCache(url, bitmap));
else
loadDefaultMarker(listener);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
loadDefaultMarker(listener);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}};Picasso.with(context)
.load(url)
.resize(maxSize, maxSize)
.into(t);}我第一次加載圖片時從不調用onBitmapLoaded()。我已經閱讀了一些話題,如https://github.com/square/picasso/issues/39,建議使用fetch(Target t)方法(這似乎是弱引用的問題......),但是這個函數在畢加索的最后一個版本(2.3.2)中沒有。我只有一個fetch()方法,但我不能同時使用(mytarget)你能解釋一下如何使用fetch()和自定義Target嗎?謝謝。Doc:http://square.github.io/picasso/javadoc/com/squareup/picasso/RequestCreator.html#fetch--
3 回答

慕少森
TA貢獻2019條經驗 獲得超9個贊
正如其他受訪者(@lukas和@mradzinski)所指出的那樣,畢加索只對該Target
對象保持弱引用。雖然你可以在你的Target
一個類中存儲一個強引用,但是如果以任何方式Target
引用a ,這仍然會有問題View
,因為你也有效地保持對它的強引用View
(這是畢加索的事情之一)明確幫助你避免)。
如果您處于這種情況,我建議將標記標記Target
為View
:
final ImageView imageView = ... // The view Picasso is loading an image intofinal Target target = new Target{...};imageView.setTag(target);
這種方法的好處是讓畢加索能夠為您處理一切。它將管理WeakReference
每個視圖的對象 - 只要不再需要一個,Target
對圖像也將被釋放的任何處理,所以你不會因長期目標而陷入內存泄漏,但你的目標會持續(xù)只要它的觀點還活著。

回首憶惘然
TA貢獻1847條經驗 獲得超11個贊
Picasso沒有對Target對象的強引用,因此它被垃圾收集并且不調用onBitmapLoaded。
解決方案很簡單,juste強烈引用了Target。
public class MyClass { private Target mTarget = new Target() {...}; public void getPointMarkerFromUrl(final String url, final OnBitmapDescriptorRetrievedListener listener) { Picasso.with(context) .load(url) .resize(maxSize, maxSize) .into(mTarget); }}

慕仙森
TA貢獻1827條經驗 獲得超8個贊
如果我有ImageView,我會這么簡單:imageView.setTag(target);
我使用下一個解決方案將Bitmaps加載到通知中,所以我只需要位圖。
因此,創(chuàng)建Set witch將存儲Target對象并在完成加載時將其刪除。
final Set<Target> protectedFromGarbageCollectorTargets = new HashSet<>();private void loadBitmap(String url) { Target bitmapTarget = new BitmapTarget(nEvent); protectedFromGarbageCollectorTargets.add(bitmapTarget); Picasso.with(context).load(url).into(bitmapTarget);}class BitmapTarget implements Target { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) { //handle bitmap protectedFromGarbageCollectorTargets.remove(this); } } } @Override public void onBitmapFailed(Drawable drawable) { protectedFromGarbageCollectorTargets.remove(this); } @Override public void onPrepareLoad(Drawable drawable) { } }
添加回答
舉報
0/150
提交
取消