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

207*_*207 6 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太早收集垃圾).android内部存储怎么样?参考sais"这些文件将在设备运行不足时首先被删除."

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

mom*_*omo 10

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

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

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

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

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

  • 好点.对于对象缓存,您可以解决SoftReference问题,并且不必担心使用此处的"LruCache"来实现:http://developer.android.com/reference/android/util/LruCache.html以及在兼容性库中. (2认同)