【问题标题】:android cache > internal storage vs. object cacheandroid 缓存 > 内部存储与对象缓存
【发布时间】:2011-09-01 19:58:49
【问题描述】:

我需要缓存来自网络的图像(仅 5 个或最多 100 个)并显示在列表视图中。如果用户选择列表视图的一行,则可以清除缓存。我看了一些例子。有些使用外部存储。有些使用内部和外部。一些对象..

那么内部存储(http://developer.android.com/guide/topics/data/data-storage.html#filesInternal 通过 getCacheDir())和对象缓存(例如 WeakHashMap 或 HashMap )的优点/缺点是什么?

软引用的一个问题似乎是它们可能被 gc'ed 太快(SoftReference gets garbage collected too early)。安卓内部存储呢?参考资料是“当设备存储空间不足时,这些文件将首先被删除。”。

使用对象缓存或临时内部存储有什么不同吗?除了对象缓存应该快一点

【问题讨论】:

    标签: java android caching garbage-collection


    【解决方案1】:

    以下是两者之间的一些区别:

    • 对象缓存比内部存储快,但容量较低。
    • 对象缓存本质上是瞬态的,而内部存储具有更长的寿命
    • 对象缓存占用堆中的实际空间。内部存储没有。这一点很重要,因为即使使用 SoftReference,使对象缓存过大也可能导致 OutOfMemoryException

    现在考虑到这些差异,它们并不是完全相互排斥的。我们实现的很多都是使用多层缓存,尤其是与图像加载相关的。以下是我们使用的步骤:

    • 如果图像尚未缓存,则从 URL 获取并将其缓存在一级缓存中,即 SoftReference/WeakHashMap 甚至使用 LinkedHashMap 限制大小的硬缓存
    • 然后我们在 LinkedHashMap 中实现 removeEldestEntry()。在达到硬缓存容量后,我们将内容移动到二级缓存,即内部存储。使用这种方法,您不必从 URL 重新获取图像 + 它仍然更快,并且可以释放您的内存
    • 我们使用 LRU 算法在后台对内部存储进行了及时清理。您不应该依赖 Android 来为您清理这些内容。

    我们已将多层缓存作为一个通用组件,并已在我们的许多项目中为我们的客户使用它。这种技术非常类似于计算机体系结构中的 L1、L2 缓存。

    【讨论】:

    • +1 它们当然不是相互排斥的!两者都需要,这是一个很好的方法。
    • 好点。对于对象缓存,您可以通过使用LruCache 在此处找到:developer.android.com/reference/android/util/LruCache.html 以及在兼容性库中解决 SoftReference 问题,而不必担心实现问题。
    • 只是另一个问题。您如何确定链表的大小/限制(10 或 50 或 100 个对象)?我想应该取决于要存储的对象的大小
    • @207 是的,没错。我将它作为通用组件的参数,以便我可以自定义我们开发的每个应用程序。
    • 你如何确定限制?例如..可以说..在最坏的情况下,我想缓存多达 1000 个位图。每个位图大约 50kb。确定一级缓存限制的方法是什么(例如linkedhashmap)
    【解决方案2】:

    你应该寻找"How do I lazy download images in ListView"和相关的问题。

    【讨论】:

    • 这是我从中获取示例的地方。一些使用内部..一些外部..一些对象...关于延迟加载而不是存储
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 2010-12-21
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2018-06-07
    • 2012-01-04
    相关资源
    最近更新 更多