【问题标题】:Best practis for handling bitmaps in android with mono droid / xamarin.android使用 mono droid / xamarin.android 在 android 中处理位图的最佳实践
【发布时间】:2013-06-26 11:57:21
【问题描述】:

在处理位图时,我们的 Android 应用程序出现了一些内存问题(呃!)。

我们有多个活动从服务器加载图像,这可能是活动的背景图像。 对于多个活动,这个背景图像可能是相同的,现在每个活动都在加载自己的背景图像。 这意味着如果流程是 ac1->ac2->ac3->ac4,则相同的图像将被加载 4 次并使用 4x 内存。

如何针对这种情况优化图像处理?我是否创建存储图像的图像缓存,然后每个活动首先向缓存询问图像。如果是这种情况,我怎么知道何时从缓存中垃圾收集图像?

非常感谢任何建议、指向优秀教程或类似内容的链接。

问候

编辑: 为设备下载图像时,会使用精确尺寸,这意味着如果 ui 元素需要 100x100 像素的图像,它会获得该尺寸,因此无需缩放。所以我不确定在将图像加载到内存时是否会缩小图像。可能需要在下一个移动时卸载活动中的图像,然后在返回时重新加载。

【问题讨论】:

标签: caching bitmap xamarin.android xamarin


【解决方案1】:

您可能想要尝试的一件事是将位图(制作缩略图)缩小到更适合您的设备的大小。如果您不按比例缩小它,使用位图快速用完 Android 设备上的所有 RAM 非常容易。这个recipe 展示了如何即时执行此操作。您可以调整它以将图像保存到磁盘。

您还可以创建自己的 LRUCache 实现来为您的应用缓存图像。

【讨论】:

  • 这是使用位图时最重要的事情。如果你让它们保持大,你会得到一个内存不足的异常。 xamarin 网站上的代码也不完整。您需要以 2 的因子对其进行采样。xamarin 的代码可以为您提供 3 的 insamplesize,但 android 会将其缩小到 2。这意味着您会得到一个太大的位图。如果您需要示例代码来解决此问题,请告诉我。
  • 随时提交补丁(说真的 - 我们喜欢来自社区的意见)。 :)
  • 好吧,我不会让它们太大,我们会下载精确尺寸的图像。所以也许需要一种卸载/重新加载图像的方法。
【解决方案2】:

准备好您的更新后,我会给您另一个提示。 如果人们想要,我仍然可以发布补丁..

您需要对这些位图做的是使用 using 块调用它们。这样,Android 将在该块执行后立即卸载位图。

例子:

using(Bitmap usedBitmap = new Bitmap()){
     //Do stuff with the Bitmap here
     //You can call usedBitmap.Dispose() but it's not really needed
}

使用此代码,您的应用不应将所有使用的位图保存在内存中。

【讨论】:

  • //You can call usedBitmap.Dispose() but it's not really needed 是不好的建议,因为处置已处置(由 using 隐式完成)对象会导致未定义的结果。
猜你喜欢
  • 2013-09-24
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
相关资源
最近更新 更多