转换后,从内存中释放位图

时间:2017-04-25 16:14:21

标签: android memory memory-management bitmap imageview

我在Bitmaps上的不同ImageView之间褪色,并且希望回收/发布Bitmap中不再可见的旧ImageView图片过渡后。

final Bitmap newBitmap = //this is a bitmap
final Bitmap oldBitmap = //this is a bitmap
final Drawable oldDrawable = new BitmapDrawable(getResources(), oldBitmap);
final Drawable newDrawable = new BitmapDrawable(getResources(), mBitmap);

Drawable[] drawables = new Drawable[]{oldDrawable, newDrawable};
final TransitionDrawable td = new TransitionDrawable(drawables);

this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        mImage.setImageDrawable(td);
        td.startTransition(1000);

        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
          @Override
          public void run() {
                oldBitmap.recycle();
          }
        }, 1050);
    }
});

当我尝试在转换结束后回收旧的Bitmap时,我收到以下错误:

  

java.lang.RuntimeException:Canvas:尝试使用循环位图android.graphics.Bitmap

转换完成后有没有办法回收Bitmap,以便释放内存而不会导致错误?

注意:当转换经历多个图像时,最终设备内存不足,因为先前设置的Bitmaps即使不再可见也不会被释放。

1 个答案:

答案 0 :(得分:0)

这可能是因为td仍然持有(和使用)oldDrawable,即使它没有显示它。

我建议打电话:

mImage.setImageDrawable(newDrawable);

在回收oldBitmap之前。这样就不应再使用td oldBitmap了,{{component modalComponent options=modalOptions}} 应该很容易回收。