3 回答

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
正如其他受訪者(@lukas和@mradzinski)所指出的那樣,畢加索只對(duì)該Target
對(duì)象保持弱引用。雖然你可以在你的Target
一個(gè)類(lèi)中存儲(chǔ)一個(gè)強(qiáng)引用,但是如果以任何方式Target
引用a ,這仍然會(huì)有問(wèn)題View
,因?yàn)槟阋灿行У乇3謱?duì)它的強(qiáng)引用View
(這是畢加索的事情之一)明確幫助你避免)。
如果您處于這種情況,我建議將標(biāo)記標(biāo)記Target
為View
:
final ImageView imageView = ... // The view Picasso is loading an image intofinal Target target = new Target{...};imageView.setTag(target);
這種方法的好處是讓畢加索能夠?yàn)槟幚硪磺?。它將管?code>WeakReference每個(gè)視圖的對(duì)象 - 只要不再需要一個(gè),Target
對(duì)圖像也將被釋放的任何處理,所以你不會(huì)因長(zhǎng)期目標(biāo)而陷入內(nèi)存泄漏,但你的目標(biāo)會(huì)持續(xù)只要它的觀點(diǎn)還活著。

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
Picasso沒(méi)有對(duì)Target對(duì)象的強(qiáng)引用,因此它被垃圾收集并且不調(diào)用onBitmapLoaded。
解決方案很簡(jiǎn)單,juste強(qiáng)烈引用了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貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果我有ImageView,我會(huì)這么簡(jiǎn)單:imageView.setTag(target);
我使用下一個(gè)解決方案將Bitmaps加載到通知中,所以我只需要位圖。
因此,創(chuàng)建Set witch將存儲(chǔ)Target對(duì)象并在完成加載時(shí)將其刪除。
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) { } }
添加回答
舉報(bào)