【问题标题】:Using LruCache and avoid OutOfMemoryException使用 LruCache 并避免 OutOfMemoryException
【发布时间】:2013-10-23 14:57:35
【问题描述】:

在我的应用程序中有一个活动,它在 1000 周围显示非常小的位图(在 20kb 周围每个位图)。在它加载一些位图后,有一个OutOfMemoryException

我第一次阅读有关SoftReference 的信息,看起来它可以解决我关于OOM exceptions 的问题。但是后来,我读到它不会缓存我的位图并且会“过早”释放它们,所以它必须再次解码位图并“浪费”时间。所以,我实现了LruCache

如何确保在实现我的LruCache 时不会收到OOM exception

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

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

【问题讨论】:

    标签: android out-of-memory soft-references android-lru-cache


    【解决方案1】:

    在实现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();
    }}
    

    【讨论】:

    • 超过指定内存怎么办?它是否释放其他分配的位图以避免内存异常?
    • 是的,最近最少使用的位图将从缓存中删除,如果没有被其他对象引用,则会被垃圾回收。
    • “将被垃圾回收”是指会被回收吗? bitmap.recycle()
    • 正如您在此处看到的,可能会出现内存不足异常,当使用 LruCache 时,它​​会垃圾收集位图但不会回收它。 stackoverflow.com/questions/10743381/…
    • 据我所知,bitmap.recycle() 仅适用于 pre-honeycomb 设备,其中位图未存储在 JVM 中,因此即使没有对象,您也有可能获得 OOM引用位图,但尚未释放堆。然后,如果您以这些设备为目标,您需要自己为位图提供一些参考计数器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多