假设我在一个位图对象中加载了一个图像
Bitmap myBitmap = BitmapFactory.decodeFile(myFile);
Run Code Online (Sandbox Code Playgroud)
现在,如果我加载另一个位图,会发生什么
myBitmap = BitmapFactory.decodeFile(myFile2);
Run Code Online (Sandbox Code Playgroud)
第一个myBitmap会发生什么?它是否收集垃圾或者我必须在加载另一个位图之前手动垃圾收集它,例如. myBitmap.recycle()
?
此外,是否有更好的方法来加载大图像并在途中回收时一个接一个地显示它们?
Fed*_*dor 75
解码第二个位图时,第一个位图不是GC.GC会在稍后决定时执行.如果你想尽快释放内存,你应该在解码第二个位图之前调用recycle().
如果要加载非常大的图像,则应重新采样.这是一个示例在将图像加载到Bitmap对象时出现奇怪的内存不足问题.
dju*_*nod 21
在加载下一个图像之前,您需要调用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;
Run Code Online (Sandbox Code Playgroud)
我将displayWidth和displayHeight缓存在我在Activity开始时初始化的静态中.
Display display = getWindowManager().getDefaultDisplay();
displayWidth = display.getWidth();
displayHeight = display.getHeight();
Run Code Online (Sandbox Code Playgroud)
Tim*_*mmm 21
我认为问题在于:在预蜂窝版本的Android上,实际的原始位图数据不会存储在VM内存中,而是存储在本机内存中.这个本机内存是当相应的java释放Bitmap
对象GC'd.
然而,当您用完本机内存时,dalvik GC不会被触发,因此您的应用程序可能只使用很少的java内存,因此dalvik GC从未被调用,但它使用大量的本机内存来制作位图最终导致OOM错误.
至少那是我的猜测.值得庆幸的是,在Honeycomb及以后,所有位图数据都存储在VM中,因此您根本不必使用它recycle()
.但对于数以百万计的2.3用户(碎片震动拳头),你应该recycle()
尽可能使用(大麻烦).或者,您也可以调用GC.
小智 11
一旦位图已加载到内存中,实际上它是由两部分数据构成的.第一部分包括有关位图的一些信息,另一部分包括有关位图像素的信息(它由字节数组构成).第一部分存在于Java使用的内存中,第二部分存在于C++使用的内存中.它可以直接使用彼此的内存.Bitmap.recycle()用于释放C++的内存.如果你只这样做,GC将收集java的一部分,并且总是使用C的内存.
蒂姆姆姆是对的.
根据:http: //developer.android.com/training/displaying-bitmaps/cache-bitmap.html
此外,在Android 3.0(API Level 11)之前,位图的后备数据存储在本机内存中,而该内存未以可预测的方式释放,可能导致应用程序短暂超出其内存限制并崩溃.
归档时间: |
|
查看次数: |
91835 次 |
最近记录: |