为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

神不在的星期二 2019-09-21 14:22:12
假设我已经在位图对象中加载了图像,例如Bitmap myBitmap = BitmapFactory.decodeFile(myFile);现在,如果我加载另一个位图,会发生什么myBitmap = BitmapFactory.decodeFile(myFile2);第一个myBitmap会怎样?它是否已收集垃圾,还是必须在加载另一个位图之前手动进行垃圾收集,例如。  myBitmap.recycle()?另外,有没有更好的方法可以加载大图像并在循环使用的过程中一个接一个地显示它们?
查看完整描述

3 回答

?
Cats萌萌

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();


查看完整回答
反对 回复 2019-09-21
?
ibeautiful

TA贡献1993条经验 获得超5个赞

我认为问题是这样的:在蜂巢之前的Android版本上,实际的原始位图数据不是存储在VM内存中,而是存储在本机内存中。这个本机内存当相应的java释放Bitmap对象GC'd。

但是,当您用完本机内存时,不会触发dalvik GC,因此您的应用程序可能会使用很少的Java内存,因此永远不会调用dalvik GC,但它会使用大量本机内存来处理位图最终导致OOM错误。

至少那是我的猜测。值得庆幸的是,在Honeycomb及更高版本中,所有位图数据都存储在VM中,因此您根本不必使用recycle()。但是对于数以百万计的2.3用户(片段摇摇拳头),您应该recycle()尽可能地使用它(非常麻烦)。或者,您也可以调用GC。


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 317 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信