如何正确处理位图

本文关键字:位图 正确处理 | 更新日期: 2023-09-27 18:06:21

我是应用程序开发的新手,我有一些困境。我有一个方法从服务器下载图像然后把它转换成位图所以我可以把它分配给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;
}

如何正确处理位图

调用Dispose()后是否有任何对象引用位图?在对象上调用dispose并不能保证释放所有内存,您仍然需要删除引用,以便垃圾收集器可以工作。

MSDN文章位图处理

相关部门:

调用Dispose之后,必须释放对Image的所有引用垃圾收集器可以回收映像所在的内存占领。有关详细信息,请参见清理非托管资源和实现Dispose方法。