android:磁盘缓存
这种方法非常适合将图像最初放入系统中。 但是,这种方法仍然存在一些问题。 每当图像需要在列表中向用户显示时,应用程序都必须重新下载每个图像。
这给用户带来了非常糟糕的体验。 用户第一次看到该列表时,他/她必须等待几秒钟(或网络连接不佳的几分钟),然后才能看到包含图像的完整列表。 但是,当用户滚动到列表的其他部分然后向后滚动时,真正的痛苦就来了。 此操作将导致整个图像下载过程重新启动!
我们可以通过使用图像缓存来消除负面的用户体验。
图像缓存使我们能够将最近下载的图像存储在设备上。 通过将它们存储在设备上,我们可以从内存中获取它们,而不必再次向服务器询问它们。 这可以通过几种不同的方式来节省我们的性能,最值得注意的是:
- 已下载的图像几乎立即显示,这使得UI更加清晰
- 无需连接网络即可保存图像,从而节省了电池寿命
使用缓存时,有一些设计注意事项。 由于缓存正在使用设备上的内存,因此其空间相当有限。 这意味着我们只能在缓存中保存一定数量的图像,因此确保将正确的图像存储在其中非常重要。 “正确”是一个非常相对的术语,根据即将到来的问题,它可能表示几种不同的含义。 如您在这里看到的,有几种不同类型的缓存算法试图为不同的问题定义“正确的”。 在我们的例子中,“正确”表示我们想要在缓存中使用最多的图像。
对我们来说幸运的是,我们需要的缓存类型很简单,并且是最常用的缓存之一。 LRU缓存将最常使用的图像保留在内存中,同时丢弃最不常用的图像。 甚至更幸运的是,Android SDK具有LRUCache实现,该实现已添加到Honey Comb中(如果您还需要支持较旧的版本,它也可以在支持库中获得 )。
使用磁盘上存储的LRUCache
LRU缓存使您可以将图像保存在内存中,而不必每次都访问服务器。 这使您的应用可以更快地响应更改并节省电池寿命。 缓存的限制之一是可用于实际存储图像的内存量。 这个空间非常有限,尤其是在移动设备上。
但是,您确实可以访问一个具有更大空间的数据存储:磁盘。
移动设备上的磁盘通常比主内存大得多。 尽管磁盘访问比主存储器要慢得多,但是它仍然比通过网络访问映像要快得多,并且通过不访问网络仍然可以节省电池寿命。
对于出色的Disk LRU Cache实现,该实现可与Android 完美配合,请在GitHub上查看Jake Wharton的DiskLRUCache 。
组合内存和磁盘缓存
尽管先前的两个缓存(内存LRUCache和磁盘LRUCache)都可以独立良好地工作,但结合使用时,它们的工作效果会更好。 通过同时使用两个缓存,您将获得两全其美的效果:
- 增加了主内存缓存的加载速度
- 磁盘缓存增加了缓存大小
结合两个缓存非常简单。
Google 在此处为内存和磁盘缓存提供了一些出色的示例代码。 您现在要做的就是采用两种不同的缓存实现,并使用上述流程图将它们放在一起,以在Android中创建2级图像缓存!
参考: Programming Mobile博客上的JCG合作伙伴 Isaac Taylor 引用 了Android中的二级图像缓存 。
翻译自: https://www.javacodegeeks.com/2012/09/android-level-two-image-cache.html
android:磁盘缓存