0

我的 Activity 有一个 ImageView,它占据了大约一半的纵向屏幕,而横向则少一点。我使用 inSampleSize 加载位图以节省内存,但我也没有做任何事情来明确清理内存。在 Gingerbread 之前,我曾经疯狂地回收我的位图,但自从位图数据显然已移入 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();
}
4

1 回答 1

0

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

if (db.getBitmap() != null && ! db.getBitmap().isRecycled()) {
            db.getBitmap().recycle();
}  
于 2013-10-24T09:40:59.643 回答