【问题标题】:Xamarin - How to properly dispose bitmaps?Xamarin - 如何正确处理位图?
【发布时间】:2015-10-26 20:23:06
【问题描述】:

我是应用程序开发的新手,我遇到了一些困境。我有一种方法可以从服务器下载图像,然后将其转换为位图,以便将其分配给 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;
}

【问题讨论】:

    标签: c# android caching bitmap xamarin


    【解决方案1】:

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

    MSDN article for Bitmap Dispose

    相关部分:

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

    【讨论】:

    • 我认为没有。
    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多