【问题标题】:how to release bitmap memory in android如何在android中释放位图内存
【发布时间】:2013-11-29 08:22:47
【问题描述】:

在我们的程序中使用了大量的图片,我们在眼睛的Activity和Fragment中解绑Drawables,如下所示

protected void unbindDrawables(View view) {
    if (view != null) {
        if (view.getBackground() != null) {
            view.getBackground().setCallback(null);
        }
        if (view instanceof ImageView) {
            ImageView imageView = (ImageView) view;
            imageView.setImageDrawable(null);
        }
        if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
            if (!(view instanceof AbsSpinner) && !(view instanceof AbsListView)) {
                ((ViewGroup) view).removeAllViews();
            }
        }
    }
}

就像https://stackoverflow.com/a/6779067说的这样,但是我用mat发现位图也占用了很多内存而没有释放。

Class Name                               |   Objects | Shallow Heap | Retained Heap

 android.graphics.Bitmap                 |       490 |       23,520 | >= 36,267,912
 android.graphics.Bitmap$1               |         1 |            8 |          >= 8
 android.graphics.Bitmap$2               |         0 |            0 |         >= 80
 android.graphics.Bitmap$BitmapFinalizer |       490 |        7,840 |      >= 7,840
 android.graphics.Bitmap$CompressFormat  |         3 |           72 |        >= 232
 android.graphics.Bitmap$CompressFormat[]|         1 |           24 |         >= 24
 android.graphics.Bitmap$Config          |         4 |           96 |        >= 360
 android.graphics.Bitmap$Config[]        |         2 |           72 |         >= 72
 android.graphics.BitmapFactory          |         0 |            0 |         >= 80
 android.graphics.BitmapFactory$Options  |         0 |            0 |              
 android.graphics.BitmapRegionDecoder    |         0 |            0 |         >= 48
 android.graphics.BitmapShader           |         9 |          216 |     >= 15,736
 Total: 12 entries (4,509 filtered)      |     1,000 |       31,848 |              

不知道为什么不发布以及如何发布,任何机构都可以帮助我,非常感谢!

【问题讨论】:

标签: android memory bitmap


【解决方案1】:

您必须调用 bitmap.recycle() 以释放解码位图时分配的本机内存。

当然,您必须注意位图的生命周期。在适当的时候释放它。更好的解决方案是使用一些图像加载器类来处理它。见https://github.com/nostra13/Android-Universal-Image-Loader

【讨论】:

  • 如果我使用 bitmap.recycle() 会出现另一个问题“尝试使用回收的位图”,而这篇文章(developer.android.com/training/displaying-bitmaps/…)说“在Android 2.3.3(API级别10 ) 及更低,建议使用recycle()”,所以当api级别>10时,我认为我们不需要调用recycle。@Robin@Mac_Focha
  • 您必须注意位图的生命周期。在适当的时候释放它。更好的解决方案是使用一些图像加载器类来处理它。见github.com/nostra13/Android-Universal-Image-Loader
  • 非常感谢,我会试试的!
【解决方案2】:

在位图上调用回收并删除对位图对象的任何引用

【讨论】:

    【解决方案3】:

    问题是,在 Android 的 Honeycomb 之前的版本中,位图的内存是(是)从非托管内存分配的,这会产生各种问题。它仍然被释放,但来自位图对象实现的终结器。这意味着至少需要 2 次 GC 才能收集到它。此外,如果由于某种原因终结器无法执行 - 你得到了图片。另一件事是 - 真的很难追踪 - DDMS 看不到它,MAT 也看不到。

    对于 Android 3.0,这已更改,位图是通过托管字节数组实现的,但对于较旧的手机...

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 2015-09-29
      • 2013-09-21
      • 2011-12-08
      • 1970-01-01
      • 2023-03-16
      • 2017-09-22
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多