Wenn Aktivität zerstören, wurde leider Bitmap nicht recycelt, wenn wir Picasso verwenden. Ich versuche, Bitmap programmgesteuert zu recyceln, was in Bildansicht geladen wird. Es gibt eine Möglichkeit, auf geladene Bitmap zu verweisen, indem Sie verwenden.
Target mBackgroundTarget = new Target() {
Bitmap mBitmap;
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if (bitmap == null || bitmap.isRecycled())
return;
mBitmap = bitmap;
mBgImage.setImageBitmap(bitmap);
mHandler.post(new Runnable() {
@Override
public void run() {
// Do some animation
}
});
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
recycle();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
/**
* Recycle bitmap to free memory
*/
private void recycle() {
if (mBitmap != null && !mBitmap.isRecycled()) {
mBitmap.recycle();
mBitmap = null;
System.gc();
}
}
};
Und wenn Aktivität zerstören, nenne ich onBitmapFailed(null)
geladen Bitmap zu recyceln.
@Override
protected void onDestroy() {
super.onDestroy();
try {
if (mBackgroundTarget != null) {
mBackgroundTarget.onBitmapFailed(null);
Picasso.with(context).cancelRequest(mBackgroundTarget);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Aber denken Sie daran, nicht zwischenspeichern IMAGE IN MEMORY von diesem Fall wird es verwenden Recycling-Bitmap Ausnahme verursachen.
Picasso.with(context)
.load(imageUrl)
.resize(width, height)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.into(mBackgroundTarget);
Hoffe diese Hilfe.
Haben noch nicht getestet, aber 'Picasso.with (Kontext) .shutdown()' kann hilfreich sein, denke ich. – activesince93