【问题标题】:How to remove images from cache on Windows 8 Phone app?如何从 Windows 8 Phone 应用程序的缓存中删除图像?
【发布时间】:2014-01-05 21:14:03
【问题描述】:

根据我的阅读,每当您通过其 Source 属性将图像分配给 XAML 元素时,都会进行某种智能缓存。

不幸的是,对于我的应用程序(闪存卡),每次用户在他/她面前轻弹(又名刷卡)卡片时,我都会动态切换 image.Source 属性。它是同一个 XAML 元素,但它的 Source 属性每次都会被替换。

我有 4 组闪存卡,如果我一次最多可以选择 3 组,应用程序可以正常运行,但如果我在计数达到第 52 或第 54 卡左右时选择 4 组,则内存使用超过150MB(这是设置的限制)和我的测试设备(诺基亚 Lumia 520)因内存不足错误而崩溃。

在分析应用程序后,我确定问题是由图像加载事件引起的。

有什么想法吗?

【问题讨论】:

  • 您使用什么作为 Source、BitmapImage 或 WriteableBitmap?每次用户滑动时你都会创建一个新图像吗?
  • 两者都是。我使用 BitmapImage,每次用户滑动时都会创建一个新图像(我将它翻译成西班牙语,所以我有带有英语和西班牙语图像的图像)。
  • 你能分享一些相关的代码吗?如果您尝试在 UriSource 超出范围之前将其设置为“null”,则有时可以阻止 BitmapImage 缓存。你可以试试吗?

标签: c# xaml windows-phone-8


【解决方案1】:

根据我的经验,在处理图像时,将不再需要的内容归零会很有帮助。

考虑到您使用的是 BitmapImage 并且每次都创建一个新的,我会尝试将位图图像 UriSource 设置为 null

bmpImage.UriSource = null;

在清空 BitmapImage 之前

bmpImage = null;

在您创建的 BitmapImage 对象超出范围之前以及在您创建新对象并将其分配给 Image 作为源之前。 (当然)

如果您使用多个 Image 对象,我也会将它们的 Source 设置为 null。 (例如,在后面的代码中创建一些复杂的图像叠加等)

这对我使用 BitmapImages 帮助很大,尤其是在后台任务中。

【讨论】:

  • 我不得不更深入地挖掘代码(我在 6 个多月前写了这个),我意识到在创建 FlashDeck 对象时,我使用 BitmapImage 对象为每张选择的卡片初始化 FlashCard 对象.所以在运行时,我唯一要做的就是将 XAML Source 属性设置为当前 FlashCard 对象的 BitmapImage,并且似乎是导致过载的代码的 XAML 部分,因为内存配置文件图表没有显示任何初始化 FlashCad 卡组后出现峰值。
  • 因此,在我的情况下,我的图像确实没有超出范围,因为它会立即被新的替换。我只是一遍又一遍地重复使用 XAML 资源(我在上面有一张卡片,下面有一张显示下一张卡片,我只是交换图像源以提供真实卡片组的错觉)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2022-11-21
  • 1970-01-01
相关资源
最近更新 更多