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

3
我有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();
}

也许你在其他地方持有位图的引用。通常不鼓励使用静态属性。为什么不将你的位图保存到文件中,然后在你的B活动中读取呢? - 2hamed
1个回答

3

来自Android开发者

释放与该位图相关的本地对象并清除对像素数据的引用。这不会同步释放像素数据;如果没有其他引用,它只是允许垃圾回收机制回收它。 该位图被标记为“死亡”,这意味着如果调用getPixels()或setPixels()将抛出异常,并且不会绘制任何内容。此操作无法撤消,因此仅在确保没有进一步使用位图时才应调用此操作。这是一个高级调用,通常不需要调用,因为当没有对该位图的引用时,正常GC过程将释放这些内存。

回收(recycle)只是确保在调用GC时,你的位图将被回收。System.gc也是如此,它不能保证gc现在就运行,它只是要求gc运行,但只有当系统想要运行时,GC才会运行。

所以请放松,如果你正在回收位图,它们最终会被回收,只需给它一些时间即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接