我有一个用于缓存缩略图和其他小位图的LRUCache。目前,我在我的主要活动中使用它,但是,我也想将它用于我的其他活动。这让我想知道将这个LRUCache对象简单地存储在我的自定义应用程序单例(扩展应用程序)中并解决在其他活动中访问缓存的问题是一个好主意。我之所以关心是因为,据我所知,如果应用程序进程被杀死 - 这很可能发生在应用程序在后台运行太长时间 - 应用程序对象因此缓存将获得垃圾集。如果我错了,请纠正我并帮助我更好地理解这个问题/提供解决这个问题的方法。
答案 0 :(得分:1)
我通常的经验法则是,对于持久数据,请使用 disk cache &快速,肮脏和轻量数据,使用内存缓存(或你的lru缓存)。小心将位图存储在内存缓存中,至少对于Android设备< 2.3.3,我相信。位图的像素数据实际上存储在本机内存中,因此开发人员可以减少控制以鼓励垃圾收集。例如,即使将位图设置为null或调用recycle()方法,也可能无法完全说服垃圾收集器释放dalvik堆(vm堆)中的位图,因为它是dalvik堆(vm堆)上的一个小对象,甚至虽然它在本机内存中的原生对应物很大,导致OutOfMemoryException。
很抱歉偏离了一点但是你应该知道。至于你的答案,你的假设是正确的。当android内存不足时,它会在其系统内存中保留最后一个用户活动实例,但可能会终止您的进程,您的进程将托管您的应用程序对象。因此,在您的情况下,如果您在应用程序对象中存储了5个位图对象,并且用户离开了一段时间,他们可能会返回到系统从新创建的应用程序对象请求位图的活动,然后生成空位图。
鉴于这些情况,解决方案通常是明确的。如果你想保留数据,你不能信任对象内存(内存,RAM),至少在Android上,所以磁盘内存可能是你最好的选择。
希望这有帮助。
答案 1 :(得分:0)
我认为这是一个非常好的主意。以下是来自Google I / O 2012的视频,其中包含一些相关信息:http://www.youtube.com/watch?v=gbQb1PVjfqM