我的 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();
}