【问题标题】:After Transition, Release Bitmap from Memory过渡后,从内存中释放位图
【发布时间】:2017-09-22 18:42:33
【问题描述】:

我在ImageView 上的不同Bitmaps 之间淡出,并希望从旧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 不会被释放,即使它们不再可见。

【问题讨论】:

  • 您可以将您尝试的代码发布到recycle Bitmap 吗?
  • @BartekLipinski 当我添加 mBitmap.recycle();转换后发生错误。我已经更新了帖子中的代码。有什么想法吗?
  • tdoldDrawable 变为 newDrawablenewDrawable 使用 mBitmap
  • @BartekLipinski 这是我在帖子中输入的一个错字。刚刚更新了帖子以反映正确的逻辑。有什么想法吗?

标签: android memory memory-management bitmap imageview


【解决方案1】:

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

我建议打电话:

mImage.setImageDrawable(newDrawable);

就在回收oldBitmap 之前。这样你的td 就不会再被使用了,oldBitmap 应该很容易被回收。

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 2019-01-20
    • 2016-01-28
    • 2017-08-20
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多