3 回答
TA贡献1805条经验 获得超9个赞
您将需要在加载下一个图像之前调用myBitmap.recycle()。
根据myFile的来源(例如,如果您无法控制原始大小),则在加载图像时(而不是简单地对任意数字重新采样),应将图像缩放到显示大小。
if (myBitmap != null) {
myBitmap.recycle();
myBitmap = null;
}
Bitmap original = BitmapFactory.decodeFile(myFile);
myBitmap = Bitmap.createScaledBitmap(original, displayWidth, displayHeight, true);
if (original != myBitmap)
original.recycle();
original = null;
我将displayWidth和displayHeight缓存在我在Activity开始时初始化的静态变量中。
Display display = getWindowManager().getDefaultDisplay();
displayWidth = display.getWidth();
displayHeight = display.getHeight();
TA贡献1993条经验 获得超5个赞
我认为问题是这样的:在蜂巢之前的Android版本上,实际的原始位图数据不是存储在VM内存中,而是存储在本机内存中。这个本机内存是当相应的java释放Bitmap
对象GC'd。
但是,当您用完本机内存时,不会触发dalvik GC,因此您的应用程序可能会使用很少的Java内存,因此永远不会调用dalvik GC,但它会使用大量本机内存来处理位图最终导致OOM错误。
至少那是我的猜测。值得庆幸的是,在Honeycomb及更高版本中,所有位图数据都存储在VM中,因此您根本不必使用recycle()
。但是对于数以百万计的2.3用户(片段摇摇拳头),您应该recycle()
尽可能地使用它(非常麻烦)。或者,您也可以调用GC。
- 3 回答
- 0 关注
- 317 浏览
添加回答
举报