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



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

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

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

任何建议、良好教程链接或类似内容都将不胜感激。

问候

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

您可能想尝试的一件事是将位图缩小到更适合您设备的大小(制作缩略图)。如果你不缩小位图,很容易快速用完安卓设备上的所有RAM。这个食谱展示了如何快速做到这一点。您可以对此进行调整以将图像保存到磁盘。

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

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

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

示例:

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

有了这段代码,你的应用程序不应该把所有使用过的位图都保存在内存中。

最新更新