在处理位图时,我们的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
}
有了这段代码,你的应用程序不应该把所有使用过的位图都保存在内存中。