在移动应用开发中,我们经常会遇到从网络请求图片到设备上展示的场景。
如果每次都重复发起请求,浪费流量、浪费电量,用户体验也不佳;
将图片持久化到磁盘也不失为一种策略;但每次从文件读取图片也存在一定的io开销,就算采用此策略,我们也需要控制磁盘缓存的容量,以免占用过多系统资源。
其实没有一个方案可以说是完美的方案,只有最适合自己业务需求的方案,才可以说是一个好方案。
我们下面所讲解的方案具备很强的通用性,设计思路简单而清晰:
1.假设每个网络图片的url具有唯一性,如果网络上的图片变化了,会引起输入源的url变化;
2.基于1,我们将url作为图片缓存的唯一标识(可以做hash,做md5,也可以用urlstring作为key,都是可以的)
3.访问优先级:内存缓存>磁盘缓存>网络资源
以上3点就是我们这个方案的基本策略,以下是技术细节:
1.对于缓存的管理,我们可以设置阀值(包括缓存存在时间和缓存容量),达到条件触发清理;还可以结合LRU(Least Recently Used 近期最少使用算法)算法来提升缓存访问效率,这需要在写缓存时对缓存的使用次数进行相应标记,此处对此算法不展开,有兴趣的自行google.
2.对于网络资源的加载我们必须采用异步的方案,如此做才不会阻塞ui的展示;可以将请求加到队列中支持并发请求,需要注意的是我们可以根据某个地址可以支持同时连接的url数量来设置最大并发请求数目,来提高效率。
3.在访问磁盘缓存/网络资源成功时,需要填充高优先级的缓存,当磁盘缓存访问成功时,填充内存缓存;当网络资源访问成功时,填充内存缓存+磁盘缓存。
对于具体的使用场合我们可以根据业务需要来决定是否采纳或部分采纳此方案,也可以对此方案中的一些策略根据项目需要进行修改(比如何时不访问磁盘缓存、何时清空缓存、何时强制刷新缓存等),来满足业务需求。