【问题标题】:Can't free memory of built drawing cache in Android 3.0无法在 Android 3.0 中释放内置绘图缓存的内存
【发布时间】:2012-01-21 14:53:36
【问题描述】:

我有一个带有菜单的应用程序,其中菜单项是来自ViewAnimator 视图的屏幕截图。一切正常。我用这个简单的片段做截图,使用许多例子中写的绘图缓存:

    // Drawing cache is off, so build it manually and create scaled bitmap
    layout.buildDrawingCache();
    Bitmap bm = layout.getDrawingCache();
    Bitmap bm_small = Bitmap.createScaledBitmap(bm, item_width, item_height, true);

在同一个函数中,我尝试释放用于创建屏幕截图的所有内存:

    layout.destroyDrawingCache();
    bm.recycle();
    bm = null;

但不幸的是,垃圾收集器没有释放这个位图内存。我还使用 HPROF 内存分析来找到一些对 Bitmap 的引用,这些引用无法被释放但我没有成功。重要的信息是,我正在为 Honeycomb Android 3.0 开发,所以屏幕截图非常大 - 每个屏幕截图占用大约 3MB 的内存并且不释放它。

我不明白,为什么 recycle 在这个例子中不起作用。我怀疑,我的设置中有一些非常特殊的问题:Android 3.0 Honeycomb + 启用硬件加速 + 启用大堆 + 使用绘图缓存。我发现的所有提示都没有帮助。

请您解释一下,为什么recycle 在这种情况下不起作用?任何帮助将不胜感激。

【问题讨论】:

    标签: android memory-leaks garbage-collection bitmap


    【解决方案1】:

    是的,我遇到了这个问题。这是非常糟糕的行为,因为位图不会自行释放。最好的建议是使用较小的位图块

    其他建议是使用SoftReference<Bitmap> 来存储您的数据对象。当需要内存时,SoftReferenced 对象会自行删除。不过要小心,您可能会丢失物品。

    虽然位图方法有缺陷。

    【讨论】:

    • 感谢您的回答。据我所知,我不能使用较小的位图,因为我必须从整个布局中截取。我认为 SoftReference 解决方案在这里也不适用,因为我没有存储对 Bitmap 的任何引用:/
    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 2019-01-20
    • 1970-01-01
    • 2022-01-22
    • 2016-07-15
    相关资源
    最近更新 更多