在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量。对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理,每次打开应用都去网络获取图片,那么用户可就不乐意了,这里的处理就是指今天要讲的缓存策略(缓存层分为三层:内存层,磁盘层,网络层)。

  关于缓存层的工作,当我们第一次打开应用获取图片时,先到网络去下载图片,然后依次存入内存缓存,磁盘缓存,当我们再一次需要用到刚才下载的这张图片时,就不需要再重复的到网络上去下载,直接可以从内存缓存和磁盘缓存中找,由于内存缓存速度较快,我们优先到内存缓存中寻找该图片,如果找到则运用,如果没有找到(内存缓存大小有限),那么我们再到磁盘缓存中去找。只要我们合理的去协调这三层缓存运用,便可以提升应用性能和用户体验。

 

1、内存层:(手机内存)

内存缓存相对于磁盘缓存而言,速度要来的快很多,但缺点容量较小且会被系统回收,这里的实现我用到了LruCache。

LruCache这个类是Android3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar包。

 

磁盘层:(SD卡)

相比内存缓存而言速度要来得慢很多,但容量很大,这里的实现我用到了DiskLruCache类。

DiskLruCache是非Google官方编写,但获得官方认证的硬盘缓存类,该类没有限定在Android内,所以理论上java应用也可以使用DiskLreCache来缓存。

这是DiskLruCache类的下载地址:http://pan.baidu.com/s/1hq0D53m 

 

网络层:(移动网络,无线网络)

这个就没什么解释的了,就是我们上网用的流量。这里的网络访问实现我用到了开源框架Volley。

开源框架Volley是2013年Google I/O大会发布的,Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

这是Volley的下载地址:http://pan.baidu.com/s/1hq1t2yo

 

先来看下效果图:

正常网络下:                                        断开网络,飞行模式下:

安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)      安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)   

Log日志打印:

安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)

 

来看下代码实现:

 

1、由于应用中很多地方需要用到上下文对象,这里我自定义了一个全局的Application,用来提供上下文对象

 1 package com.lcw.rabbit.image.utils;
 2 
 3 import android.app.Application;
 4 /**
 5  * Application类,提供全局上下文对象
 6  * @author Rabbit_Lee
 7  *
 8  */
 9 public class MyApplication extends Application {
10 
11     public static String TAG;
12     public static MyApplication myApplication;
13 
14     public static MyApplication newInstance() {
15         return myApplication;
16     }
17 
18     @Override
19     public void onCreate() {
20         super.onCreate();
21         TAG = this.getClass().getSimpleName();
22         myApplication = this;
23 
24     }
25 }

 

2、Volley请求队列处理类,用来管理Rquest请求对象操作

 1 package com.lcw.rabbit.image;
 2 
 3 import com.android.volley.Request;
 4 import com.android.volley.RequestQueue;
 5 import com.android.volley.toolbox.Volley;
 6 import com.lcw.rabbit.image.utils.MyApplication;
 7 
 8 /**
 9  * 请求队列处理类
10  * 获取RequestQueue对象
11  */
12 public class VolleyRequestQueueManager {
13     // 获取请求队列类
14     public static RequestQueue mRequestQueue = Volley.newRequestQueue(MyApplication.newInstance());
15 
16     //添加任务进任务队列
17     public static void addRequest(Request<?> request, Object tag) {
18         if (tag != null) {
19             request.setTag(tag);
20         }
21         mRequestQueue.add(request);
22     }
23     
24     //取消任务
25     public static void cancelRequest(Object tag){
26         mRequestQueue.cancelAll(tag);
27     }
28     
29     
30 
31 }

 

3、这里附上2个工具类(生成MD5序列帮助类,DiskLruCache磁盘缓存类)

 1 package com.lcw.rabbit.image.utils;
 2 
 3 import java.math.BigInteger;
 4 import java.security.MessageDigest;
 5 import java.security.NoSuchAlgorithmException;
 6 
 7 public class MD5Utils {
 8     /**
 9      * 使用md5的算法进行加密
10      */
11     public static String md5(String plainText) {
12         byte[] secretBytes = null;
13         try {
14             secretBytes = MessageDigest.getInstance("md5").digest(
15                     plainText.getBytes());
16         } catch (NoSuchAlgorithmException e) {
17             throw new RuntimeException("没有md5这个算法!");
18         }
19         String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字
20         // 如果生成数字未满32位,需要前面补0
21         for (int i = 0; i < 32 - md5code.length(); i++) {
22             md5code = "0" + md5code;
23         }
24         return md5code;
25     }
26 
27 }
MD5转换类

相关文章:

  • 2021-10-02
  • 2022-12-23
  • 2018-04-22
  • 2022-12-23
  • 2021-11-01
  • 2021-08-23
  • 2021-10-18
猜你喜欢
  • 2022-01-11
  • 2022-12-23
  • 2022-01-12
  • 2021-10-26
  • 2021-10-02
  • 2022-02-22
  • 2021-08-08
相关资源
相似解决方案