我是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;
}
答案 0 :(得分:0)
调用Dispose()后是否有引用Bitmaps的对象?调用对象的dispose不能保证释放所有内存,你仍然必须删除引用,以便垃圾收集器可以完成它的工作。
MSDN article for Bitmap Dispose
相关部分:
调用Dispose后,必须释放对Image的所有引用 垃圾收集器可以回收Image所占用的内存 占领。有关更多信息,请参阅清理非托管资源 并实现一个处理方法。