Android 使用LruCache并避免OutOfMemoryException
我的应用程序中有一个活动,它显示了大约1000个非常小的位图(每个位图大约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 或者,这
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。然后,如果您以这些设备为目标,您需要自己为位图设置一些参考计数器。