🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 12.2 Android中的缓存策略 缓存策略在Android中有着广泛的使用场景,尤其在图片加载这个场景下,缓存策略就变得更为重要。考虑一种场景:有一批网络图片,需要下载后在用户界面上予以显示,这个场景在PC环境下是很简单的,直接把所有的图片下载到本地再显示即可,但是放到移动设备上就不一样了。不管是Android还是iOS设备,流量对于用户来说都是一种宝贵的资源,由于流量是收费的,所以在应用开发中并不能过多地消耗用户的流量,否则这个应用肯定不能被用户所接受。再加上目前国内公共场所的WiFi普及率并不算太高,因此用户在很多情况下手机上都是用的移动网络而非WiFi,因此必须提供一种解决方案来解决流量的消耗问题。 如何避免过多的流量消耗呢?那就是本节所要讨论的主题:缓存。当程序第一次从网络加载图片后,就将其缓存到存储设备上,这样下次使用这张图片就不用再从网络上获取了,这样就为用户节省了流量。很多时候为了提高应用的用户体验,往往还会把图片在内存中再缓存一份,这样当应用打算从网络上请求一张图片时,程序会首先从内存中去获取,如果内存中没有那就从存储设备中去获取,如果存储设备中也没有,那就从网络上下载这张图片。因为从内存中加载图片比从存储设备中加载图片要快,所以这样既提高了程序的效率又为用户节约了不必要的流量开销。上述的缓存策略不仅仅适用于图片,也适用于其他文件类型。 说到缓存策略,其实并没有统一的标准。一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是存储设备缓存,它们的缓存大小都是有限制的,因为内存和诸如SD卡之类的存储设备都是有容量限制的,因此在使用缓存时总是要为缓存指定一个最大的容量。如果当缓存容量满了,但是程序还需要向其添加缓存,这个时候该怎么办呢?这就需要删除一些旧的缓存并添加新的缓存,如何定义缓存的新旧这就是一种策略,不同的策略就对应着不同的缓存算法,比如可以简单地根据文件的最后修改时间来定义缓存的新旧,当缓存满时就将最后修改时间较早的缓存移除,这就是一种缓存算法,但是这种算法并不算很完美。 目前常用的一种缓存算法是LRU(Least Recently Used), LRU是近期最少使用算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象。采用LRU算法的缓存有两种:LruCache和DiskLruCache, LruCache用于实现内存缓存,而DiskLruCache则充当了存储设备缓存,通过这二者的完美结合,就可以很方便地实现一个具有很高实用价值的ImageLoader。本节首先会介绍LruCache和DiskLruCache,然后利用LruCache和DiskLruCache来实现一个优秀的ImageLoader,并且提供一个使用ImageLoader来从网络下载并展示图片的例子,在这个例子中体现了ImageLoader以及大批量网络图片加载所涉及的大量技术点。