Xamarin - 如何正确处理位图?

时间:2015-08-04 12:17:13

标签: c# android caching bitmap xamarin

我是App开发的新手,我有一些困境。我有一个方法从服务器下载图像,然后将其转换为位图,以便我可以将其分配给ImageView。问题是,如果我将其调用超过10次,则应用程序会因OutOfMemory异常而崩溃。我尝试使用Dispose()删除旧的位图,但它无法按预期工作。有任何解决这个问题的方法吗? 代码:

/...
string url = deviceModel.LastPhotoLink;
Bitmap imageBitmap = await new ImageDownloader().GetImageBitmapFromUrlAsync(url, Activity);
lastPhoto.SetImageBitmap(imageBitmap);
imageBitmap.Dispose();
/...

public async Task<Bitmap> GetImageBitmapFromUrlAsync(string url, Context context) {
     WebClient client = new WebClient();
     ISharedPreferences pref = context.GetSharedPreferences("UserSession", FileCreationMode.Private);
     string cookie = pref.GetString("PHPSESSID", string.Empty);
     client.Headers.Add(HttpRequestHeader.Cookie, "PHPSESSID=" + cookie);
     var imageBytes = await Task.Run(() => client.DownloadData(url));
     Bitmap imageBitmap = await Task.Run(() => BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length));

return imageBitmap;
}

1 个答案:

答案 0 :(得分:0)

调用Dispose()后是否有引用Bitmaps的对象?调用对象的dispose不能保证释放所有内存,你仍然必须删除引用,以便垃圾收集器可以完成它的工作。

MSDN article for Bitmap Dispose

相关部分:

  

调用Dispose后,必须释放对Image的所有引用   垃圾收集器可以回收Image所占用的内存   占领。有关更多信息,请参阅清理非托管资源   并实现一个处理方法。