我的活动有一个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();
}
答案 0 :(得分:0)
请参阅Stackoverflow : trying-to-use-a-recycled-bitmap-android-graphics-bitmap 并使用:
if (db.getBitmap() != null && ! db.getBitmap().isRecycled()) {
db.getBitmap().recycle();
}