Caching 使用mono droid/xamarin.android在android中处理位图的最佳实践

Caching 使用mono droid/xamarin.android在android中处理位图的最佳实践,caching,bitmap,xamarin.android,xamarin,Caching,Bitmap,Xamarin.android,Xamarin,在处理位图时,我的android应用程序出现了一些内存问题(duh!) 我们有多个活动正在从服务器加载图像,这可能是该活动的背景图像。 对于多个活动,此背景图像可能是相同的,现在每个活动都在加载自己的背景图像。 这意味着,如果流为ac1->ac2->ac3->ac4,则相同的图像将加载4次,并使用4倍内存 如何针对此场景优化imagehandling?我是否创建一个存储图像的图像缓存,然后每个活动都会首先向缓存请求图像。如果是这种情况,我如何知道何时从缓存中对图像进行垃圾收集 任何建议,链接到好

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

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

如何针对此场景优化imagehandling?我是否创建一个存储图像的图像缓存,然后每个活动都会首先向缓存请求图像。如果是这种情况,我如何知道何时从缓存中对图像进行垃圾收集

任何建议,链接到好的教程或类似的高度赞赏

问候

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

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


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

准备好更新后,我会给您一个其他提示。 如果人们愿意,我也可以发布补丁

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

例如:

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

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

这是使用位图时最重要的一件事。如果将它们保持为大,则会出现内存不足异常。此外,xamarin站点上的代码也不完整。你需要在2的因子中取样。xamarin的代码可以给你一个3的样本大小,但android会将其缩小到2。这意味着您将得到一个太大的位图。如果您需要示例代码来修复此问题,请告诉我。请随时提交修补程序(说真的,我们喜欢来自社区的输入)。:)好吧,我不把它们放得太大,我们下载的图片的确切大小。因此,可能需要一种卸载/重新加载图像的方法。您可以查看Universal Image Loader,它可能是最好的缓存解决方案。它还可以进行一些智能内存处理。如果需要,我可以上载Xamarin的所有绑定。要缩小图像大小并加载压缩格式,您可以参考此
//您可以调用usedBitmap.Dispose(),但实际上不需要它
,这是错误的建议,因为处置disposed(由
使用
隐式完成)对象会导致未定义的结果。