如何在android中释放位图内存

时间:2013-11-29 08:22:47

标签: android memory bitmap

在我们的程序中使用大量图像,我们在eyery Activity和Fragment中取消绑定,如下所示

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 |              

我不知道为什么它不会被释放以及如何释放它,任何身体都可以帮助我,非常感谢!

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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