即使我回收位图,内存使用量也不会减少

时间:2017-01-19 10:59:07

标签: java android bitmap out-of-memory recycle

我有A和B活动。当我从活动A开始活动B时,我在活动B上设置静态位图变量。我在屏幕上显示该位图并旋转它。

当活动B完成后,我会在onDestroy()方法上回收所有位图,但内存使用量没有减少。

@Override
protected void onDestroy() {
    super.onDestroy();
    if (bitmap90 != null) {
        bitmap90.recycle();
        bitmap90 = null;
    }
    if (bitmap180 != null) {
        bitmap180.recycle();
        bitmap180 = null;

    }
    if (bitmap270 != null) {
        bitmap270.recycle();
        bitmap270 = null;
    }

    if (mBitmap != null) {
        mBitmap.recycle();
        mBitmap = null;
    }

    if (((BitmapDrawable) ivOriginal.getDrawable()).getBitmap() != null) {
        ((BitmapDrawable) ivOriginal.getDrawable()).getBitmap().recycle();
        ivOriginal.setImageDrawable(null);
    }

    if (((BitmapDrawable) ivOriginal90.getDrawable()).getBitmap() != null) {
        ((BitmapDrawable) ivOriginal90.getDrawable()).getBitmap().recycle();
        ivOriginal90.setImageDrawable(null);
    }

    System.gc();
}

1 个答案:

答案 0 :(得分:2)

来自Android Developer

  

释放与此位图关联的本机对象,并清除对像素数据的引用。 这不会同步释放像素数据;如果没有其他参考资料,它只是允许垃圾收集。位图标记为" dead",这意味着如果调用getPixels()或setPixels(),它将抛出异常,并且不会绘制任何内容。此操作无法撤消,因此只有在您确定位图没有进一步用途时才应调用此操作。这是一个高级调用,通常不需要调用,因为正常的GC进程将在没有更多对此位图的引用时释放此内存。

回收只是确保在调用GC时您的位图将被回收。 对于System.gc来说也是如此,它无法确保gc现在可以运行,它只会要求gc运行,但GC只会在系统需要运行时运行。

所以放松一下,如果你要回收位图,他们会得到回收,最后只是给它一些时间。