假设我在一个位图对象中加载了一个图像,如下所示
Bitmap myBitmap = BitmapFactory.decodeFile(myFile);现在,如果我加载另一个位图,会发生什么呢
myBitmap = BitmapFactory.decodeFile(myFile2);第一个myBitmap会发生什么?它会被垃圾回收吗?还是我必须在加载另一个位图之前手动对其进行垃圾回收。myBitmap.recycle()
另外,有没有更好的方法来加载大图像,并在回收的过程中一个接一个地显示它们?
发布于 2010-09-30 09:18:11
当您解码第二个位图时,第一个位图不是garbage collected。Garbage Collector将在稍后做出决定时执行此操作。如果你想尽快释放内存,你应该在解码第二个位图之前调用recycle()。
如果你想加载非常大的图像,你应该重新采样它。这里有一个例子:Strange out of memory issue while loading an image to a Bitmap object。
发布于 2012-11-30 01:59:24
我认为问题在于:在Android的Honeycomb之前的版本中,实际的原始位图数据不是存储在VM内存中,而是存储在本机内存中。当对应的java Bitmap对象被GC'd时,该本机内存被释放。
然而,当你耗尽本机内存时,dalvik GC不会被触发,所以你的应用程序可能只使用了很少的java内存,所以dalvik GC永远不会被调用,但它使用了大量的本机内存来存储位图,这最终会导致OOM错误。
至少我是这么想的。值得庆幸的是,在Honeycomb和以后的版本中,所有的位图数据都存储在VM中,所以你根本不需要使用recycle()。但对于数以百万计的2.3用户(碎片抖动拳头),你应该尽可能使用recycle() (一个巨大的麻烦)。或者,您也可以改为调用GC。
发布于 2011-07-11 17:31:34
在加载下一个图像之前,您需要调用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。
Display display = getWindowManager().getDefaultDisplay();
displayWidth = display.getWidth();
displayHeight = display.getHeight();https://stackoverflow.com/questions/3823799
复制相似问题