首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android: Bitmap recycle()是如何工作的?

Android: Bitmap recycle()是如何工作的?
EN

Stack Overflow用户
提问于 2010-09-30 00:39:06
回答 5查看 99.5K关注 0票数 93

假设我在一个位图对象中加载了一个图像,如下所示

代码语言:javascript
复制
Bitmap myBitmap = BitmapFactory.decodeFile(myFile);

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

代码语言:javascript
复制
myBitmap = BitmapFactory.decodeFile(myFile2);

第一个myBitmap会发生什么?它会被垃圾回收吗?还是我必须在加载另一个位图之前手动对其进行垃圾回收。myBitmap.recycle()

另外,有没有更好的方法来加载大图像,并在回收的过程中一个接一个地显示它们?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-30 09:18:11

当您解码第二个位图时,第一个位图不是garbage collectedGarbage Collector将在稍后做出决定时执行此操作。如果你想尽快释放内存,你应该在解码第二个位图之前调用recycle()

如果你想加载非常大的图像,你应该重新采样它。这里有一个例子:Strange out of memory issue while loading an image to a Bitmap object

票数 82
EN

Stack Overflow用户

发布于 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。

票数 27
EN

Stack Overflow用户

发布于 2011-07-11 17:31:34

在加载下一个图像之前,您需要调用myBitmap.recycle()。

根据myFile的来源(例如,如果它是您无法控制原始大小的内容),在加载图像时,而不是简单地重新采样某个任意数字,您应该将图像缩放到显示大小。

代码语言:javascript
复制
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。

代码语言:javascript
复制
Display display = getWindowManager().getDefaultDisplay();
displayWidth = display.getWidth();
displayHeight = display.getHeight();
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3823799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档