Android:位图recycle()如何工作?

假设我已经在位图对象中加载了图像,例如


Bitmap myBitmap = BitmapFactory.decodeFile(myFile);

现在,如果我加载另一个位图,会发生什么


myBitmap = BitmapFactory.decodeFile(myFile2);

第一个myBitmap会怎样?它是否已收集垃圾,还是必须在加载另一个位图之前手动进行垃圾收集,例如。  myBitmap.recycle()?


另外,有没有更好的方法可以加载大图像并在循环使用的过程中一个接一个地显示它们?


神不在的星期二
浏览 318回答 3
3回答

Cats萌萌

您将需要在加载下一个图像之前调用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();

ibeautiful

我认为问题是这样的:在蜂巢之前的Android版本上,实际的原始位图数据不是存储在VM内存中,而是存储在本机内存中。这个本机内存是当相应的java释放Bitmap对象GC'd。但是,当您用完本机内存时,不会触发dalvik GC,因此您的应用程序可能会使用很少的Java内存,因此永远不会调用dalvik GC,但它会使用大量本机内存来处理位图最终导致OOM错误。至少那是我的猜测。值得庆幸的是,在Honeycomb及更高版本中,所有位图数据都存储在VM中,因此您根本不必使用recycle()。但是对于数以百万计的2.3用户(片段摇摇拳头),您应该recycle()尽可能地使用它(非常麻烦)。或者,您也可以调用GC。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android