android cache>内部存储与对象缓存

时间:2011-09-01 19:58:49

标签: java android caching garbage-collection

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

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

软引用的一个问题似乎是它们可能得到的速度太快(SoftReference gets garbage collected too early)。 android内部存储怎么样?参考sais“这些文件将在设备运行不足时首先被删除。”。

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

2 个答案:

答案 0 :(得分:10)

以下是两者之间的一些差异:

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

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

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

我们已经使多层缓存了一个共同的组件,并为我们的客户使用了它们的许多项目。这种技术几乎跟随计算机体系结构中的L1,L2缓存。

答案 1 :(得分:0)

您应该查找问题"How do I lazy download images in ListView"并且相关。