我有一个片段,其中包含一个使用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;
}
}
答案 0 :(得分:0)
重新使用位图很棘手。根据我的经验,您可以回收它们并立即调用GarbageCollector以获取Bitmap使用的内存,或者当您进入使用它们的Activity时尝试保持所有ImageView准备就绪,然后在您离开它时回收它们的位图