还是要在Android 4+中回收位图?

时间:2013-09-27 03:25:48

标签: java android memory-management bitmap

我的活动有一个ImageView,它占据了大约一半的人像画面,而且景观略少。我使用inSampleSize加载Bitmap以节省我的内存,但我也没有做任何明确清理内存的事情。在Gingerbread之前,我曾经疯狂地回收我的Bitmaps,但由于Bitmap数据显然被转移到了Dalvik VM,我已经更放松了。没有任何清理代码,事情在正常使用情况下工作,但我注意到如果我多次旋转此Activity,我会耗尽内存。所以,我添加了你在Gingerbread之前看到的那种积极的内存清理代码,它不再崩溃。我想知道这一点是否过度杀戮了。所有这些代码都等同于在onDestroy中将我的Bitmap和ImageView设置为null,还是所有这些跟踪底层Bitamp对象并回收它们仍然有效且必要的额外工作?这是修复我的OOME崩溃的代码:

Bitmap thumbnail;
@InjectView(R.id.thumbnail) ImageView image;

@Override
protected void onDestroy() {
    cleanupImageMemory();
    super.onDestroy();
}

private void cleanupImageMemory() {
    if (thumbnail != null) {
        thumbnail.recycle();
        thumbnail = null;
    }
    if (image != null) {
        Drawable d = image.getDrawable();
        if (d != null && d instanceof BitmapDrawable) {
            BitmapDrawable db = (BitmapDrawable) d;
            if (db.getBitmap() != null) {
                db.getBitmap().recycle();
            }
        }
        d = null;
        image = null;
    }
    System.gc();
}

1 个答案:

答案 0 :(得分:0)

请参阅Stackoverflow : trying-to-use-a-recycled-bitmap-android-graphics-bitmap 并使用:

if (db.getBitmap() != null && ! db.getBitmap().isRecycled()) {
            db.getBitmap().recycle();
}