2017-01-19 109 views
5

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

也许你在其他地方持有对你的位图的引用。通常不鼓励使用静态属性。你为什么不把你的位图保存在一个文件中,然后在你的B活动中读取它? –

回答

2

Android Developer

免与该位图相关联的原生对象,并清除参考像素数据。 这不会同步释放像素数据;它只是允许它被垃圾收集,如果没有其他的参考文献。位图被标记为“死”的,这意味着它会抛出一个异常的getPixels()或的setPixels()被调用,并且将绘制什么。这个操作不能颠倒过来,所以只有在你确定没有进一步的位图使用时才应该调用它。这是一种先进的呼叫,并且通常不需要叫,因为正常的GC进程将释放该内存的时候有这个位图不再引用。

回收只是确保您的位图将被回收,每当GC被调用。 也是一样的System.gc,它不能确保GC运行,现在,它只是要求GC​​运行,但是当系统需要的它运行GC才会运行。

所以只是放松,如果你正在回收,他们将得到回收的位图最终只是给它一些时间。