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