移动应用中,我们一般将网络图片分为三个级别,第一级别是网络层,即根据图片的url地址可以找到服务器上相应图片,获取这一层的图片会消耗流量,所以我们希望可以获取后本地就永久使用,所以就会有接下来的缓存策略;第二层缓存是在手机内存层,是将第一层的图片下载到手机内存,这种缓存读取速度非常快,但当图片内存被回收时,图片自然就不会存在了,第三层则是在手机硬盘层,是会缓存到sd卡。但这一层相对于内存的读取速度会慢很多,所以,很好的协调这三层图片缓存就可以提升应用性能和用户体验。
秉着不重复造轮子原则,这里我采用Volley+LruCache+DiskLruCache三个谷歌官方认可的库来实现网络图片三级缓存。并且以“one line”风格来实现将网络图片显示在ImageView上,而无需关心任何缓存细节。
类库下载
- Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的,你可以通过git来clone源码并倒入项目:
这个地址可能会被和谐,所以你可以在这里下载完整的jar包:
2.LruCache这个类是Android3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar包。
3.DiskLruCache是非Google官方编写,但获得官方认证的硬盘缓存类,该类没有限定在Android内,所以理论上java应用也可以使用DiskLreCache来缓存。该类你可以在这个下载:http://cdn.saymagic.cn/150131132428.java
方法与流程
1.要想实现图片三级缓存,就需要将图片下载到本地,我们所有网络图片请求都是通过Volley来统一管理的,Volley需要我们声明一个RequesQueuetManager来维持请求队列,因此,我们首先定义RequesQueuetManager
类来管理RequesQueuetManager,代码如下:
public class RequesQueuetManager {
public static RequestQueue mRequestQueue = Volley.newRequestQueue(DemoApplication.getInstance());
public static void addRequest(Request<?> request, Object object){
if (object != null){
request.setTag(object);
}
mRequestQueue.add(request);
}
public static void cancelAll(Object tag) {
mRequestQueue.cancelAll(tag);
}
}
因为RequestQueue需要一个Context类型参数,所以我们在
Volley.newRequestQueue(DemoApplication.getInstance())
这句里传入了
DemoApplication.getInstance()
,这个静态方法是什么呢?就是应用的application实例,我们自定义一个application,然后将这个application传入给RequestQueue,我们自定义的application如下:
-
publicclassDemoApplicationextendsApplication{
-
publicstaticString TAG;
-
privatestaticDemoApplication application;
-
publicstaticDemoApplication getInstance(){
-
return application;
-
}
-
-
@Override
-
publicvoid onCreate(){
-
super.onCreate();
-
TAG =this.getClass().getSimpleName();
-
application =this;
-
}
-
}