" RuntimeException:尝试重用循环的位图"

时间:2015-02-28 16:32:54

标签: android bitmap recycle

我有一个片段,其中包含一个使用fragmentStatePagerAdapter的简单viewpager。

当用户点击列表视图中的项目时,上面提到的片段将被创建并变为可见。在片段的viewpager中,有一个包含位图的imageview。

当我使用后退按钮再次转到listactivity并再次选择相同的项目(片段)时,我收到错误“RuntimeException:尝试重用再循环的位图”。在这个momement我可以看到应用程序输出中的日志 来自ondestroy方法

这真的很奇怪,因为我只从片段中的onDestroy方法中回收位图。所以我想知道为什么我有这个异常,即使每次我在列表中选择一个项目时都会创建一个viewpager片段,当我按下后退按钮时会调用ondestroy。

从互联网下载图像时调用的方法包含以下代码段:

result = Bitmap.CreateBitmap (maskDrawable.IntrinsicWidth, maskDrawable.IntrinsicHeight, Bitmap.Config.Argb8888);
Paint paint = new Paint ();
paint.SetXfermode (new PorterDuffXfermode (PorterDuff.Mode.SrcAtop));
Canvas canvas = new Canvas (result);
if(canvas != null && mask !=null && scaledBitmap != null && result != null)
{
    canvas.DrawBitmap (mask, 0, 0, null); //error here
    canvas.DrawBitmap (scaledBitmap, 0, 0, paint);
}
if (imageBackground != null && activity != null) 
{
        activity.RunOnUiThread (() => imageView.SetImageBitmap(result));
}

来自viewpager片段的onDestroy方法:

public override void OnDestroy ()
{
        Console.WriteLine ("ondestroy viewpagerfragment");
        base.OnDestroy ();
        if (infoBtn != null)
        {
            infoBtn.Click -= ShowInfoDialog;
        }
        FileDownloader.DownloadCompletedEvent -= HandleDownloadCompletedEvent;
        imageView.SetImageBitmap(null);

        if (result != null) 
        {
            Console.WriteLine ("result RECYCLED");
            result.Recycle ();
            result = null;
        }
        if (drug != null) 
        {
            drug.Recycle ();
            drug = null;
        }
        if (mask != null) 
        {
            mask.Recycle ();
            mask = null;
        }
    }

1 个答案:

答案 0 :(得分:0)

重新使用位图很棘手。根据我的经验,您可以回收它们并立即调用GarbageCollector以获取Bitmap使用的内存,或者当您进入使用它们的Activity时尝试保持所有ImageView准备就绪,然后在您离开它时回收它们的位图