Android 使用LruCache并避免OutOfMemoryException

Android 使用LruCache并避免OutOfMemoryException,android,out-of-memory,soft-references,android-lru-cache,Android,Out Of Memory,Soft References,Android Lru Cache,我的应用程序中有一个活动,它显示了大约1000个非常小的位图(每个位图大约20kb)。加载一些位图后,会出现OutOfMemoryException 我第一次读到的是SoftReference,它似乎可以解决我关于OOM异常的问题。但后来,我读到它不会缓存我的位图,并且会“太快”释放它们,因此它将不得不再次解码位图并“浪费”时间。因此,我实现了LruCache 如何确保在实现我的LruCache时不会出现OOM异常 也许我应该使用SoftReference,因为我的主要目标是避免OOM 或者,这

我的应用程序中有一个活动,它显示了大约1000个非常小的位图(每个位图大约
20kb)。加载一些位图后,会出现
OutOfMemoryException

我第一次读到的是
SoftReference
,它似乎可以解决我关于
OOM异常的问题。但后来,我读到它不会缓存我的位图,并且会“太快”释放它们,因此它将不得不再次解码位图并“浪费”时间。因此,我实现了
LruCache

如何确保在实现我的
LruCache
时不会出现
OOM异常

也许我应该使用SoftReference,因为我的主要目标是避免
OOM


或者,这可能是我的解决方案

在实现
LruCache
时,您应该指定缓存大小,并告诉它如何计算每个对象的大小(在这种情况下,对象是位图)

您可以使用以下示例:

// uses 1/8th of the memory for the cache
final int cacheSize = (int) (Runtime.getRuntime().maxMemory() / 8L);
LruCache bitmapCache = new LruCache(cacheSize) {
   protected int sizeOf(String key, Bitmap value) {
       return value.getByteCount();
}}

如果超过指定的内存,会发生什么情况?是否释放其他分配的位图以避免内存异常?是的,最近使用最少的位图将从缓存中删除,如果未被其他对象引用,将被垃圾收集。“将被垃圾收集”表示它将被回收?正如您在这里看到的,可能会出现outofmemory异常,当使用LruCache时,它会对位图进行垃圾收集,但不会对其进行回收。据我所知,
bitmap.recycle()
仅适用于蜂窝设备之前的设备,其中位图未存储在JVM中,因此即使没有对象引用位图,但堆尚未释放,也有可能得到OOM。然后,如果您以这些设备为目标,您需要自己为位图设置一些参考计数器。