【问题标题】:ImageSource not disposed and creating OutOfMemoryExceptionImageSource 未处理并创建 OutOfMemoryException
【发布时间】:2018-02-09 08:36:01
【问题描述】:

我正在开发一个 Xamarin.Forms 应用程序,

在我的一个页面中,我有多个包含图像的自定义 StackLayout (ActivityTypeView)。这些 StackLayout 是在我的页面中的 Grid 内动态创建和添加的。

在我的 ActivityTypeView 中,我将图像源设置如下:

WorkIcon.Source = ImageSource.FromFile("disable.png");

(我的图像保存在我的可绘制文件夹中)

问题是,当我转到另一个页面并多次返回时,在尝试加载图像时,我总是在某个时刻出现 OutOfMemory 异常。

我认为当我更改页面时,我的 ImageSource 不会被破坏/处置。因此,在我多次重新加载同一页面后,它总是会出现此错误。

我想知道如何处理这种情况。如何正确处置资源以及​​何时处置?

【问题讨论】:

    标签: image xamarin xamarin.forms imagesource


    【解决方案1】:

    我养成了使用FFImageLoadingLibrary 的习惯,该FFImageLoadingLibrary 负责正确缓存和重用图像资源。例如,在您的情况下,它会帮助您始终使用相同的内存中图像,而不是每次都加载一个新图像,最终导致 OutOfMemoryException。

    您可以简单地用 CachedImage 替换所有 Image 类,并设置相当多的属性来控制缓存、下采样和其他事情。这是文档:Xamarin.Forms API

    【讨论】:

    • 使用 FFImageLoadingLibrary 修复了我的崩溃问题!我想使用 Xamarin 分析器来查看内存发生了什么,但我没有 Visual Studio Enterprise 来监视我的应用程序。你知道内存是否在某个时候被释放了吗?或者库只是在应用运行时缓存图像?
    • @LucienMoor 很高兴听到这个消息!在我的情况下,库将图像加载到内存一次并一遍又一遍地重用它。这样我们就不必担心内存被释放了。您会注意到,从长远来看,使用该库确实是值得的。
    【解决方案2】:

    我不确定您的图像是否很大,但如果是,则不应将整个图像文件加载到内存中。 Here 是一种加载带有 imageview 边界的图像的方法。它适用于 android,但肯定有 Xamarin.Forms 的等价物

    【讨论】:

    • 我的图片不是那么大,但调整图片大小会有所帮助!接受的答案中提出的库允许我们这样做!
    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多