Android图片三级缓存的原理及其实现

  

<强>为什么要使用三级缓存

  
      <李>如今的安卓应用经常会需要网络交互,通过网络获取图片是再正常不过的事了李   <李>假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响李   <李>特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知李   <李>所以提出三级缓存策略,通过网络,本地,内存三级缓存图片,来减少不必要的网络交互,避免浪费流量   
  

<强>什么是三级缓存

  
      <李>网络缓存,不优先加载,速度慢,浪费流量   <李>本地缓存,次优先加载,速度快李   <李>内存缓存优,先加载,速度最快李   
  

<强>三级缓存原理

  
      <李>首次加载Android应用程序时,肯定要通过网络交互来获取图片,之后我们可以将图片保存至本地SD卡和内存中李   <李>之后运行应用程序时,优先访问内存中的图片缓存,若内存中没有,则加载本地SD卡中的图片   <李>总之,只在初次访问新内容时,才通过网络获取图片资源李   
  

具体实现及代码
  

  

1。自定义的图片缓存工具类(MyBitmapUtils)

  
      <李>通过新MyBitmapUtils ()。显示器(ImageView ivPic,字符串url)提供给外部方法进行图片缓存的接口   <李>参数含义:ivPic用于显示图片的ImageView, url获取图片的网络地址李   
     /* *   *自定义的BitmapUtils,实现三级缓存   */公开课MyBitmapUtils {      私人NetCacheUtils mNetCacheUtils;   私人LocalCacheUtils mLocalCacheUtils;   私人MemoryCacheUtils mMemoryCacheUtils;      公共MyBitmapUtils () {   mMemoryCacheUtils=new MemoryCacheUtils ();   mLocalCacheUtils=new LocalCacheUtils ();   mNetCacheUtils=new NetCacheUtils (mLocalCacheUtils mMemoryCacheUtils);   }      公共空间显示(ImageView ivPic,字符串url) {   ivPic.setImageResource (R.mipmap.pic_item_list_default);   位图的位图;//内存缓存   位图=mMemoryCacheUtils.getBitmapFromMemory (url);   如果(位图!=null) {   ivPic.setImageBitmap(位图);   System.out.println(“从内存获取图片啦.....”);   返回;   }//本地缓存   位图=mLocalCacheUtils.getBitmapFromLocal (url);   如果(位图!=null) {   ivPic.setImageBitmap(位图);   System.out.println(“从本地获取图片啦.....”);//从本地获取图片后,保存至内存中   mMemoryCacheUtils.setBitmapToMemory (url,位图);   返回;   }//网络缓存   mNetCacheUtils.getBitmapFromNet (ivPic、url);   }   }      之前      

2。网络缓存(NetCacheUtils)

  
      <李>网络缓存中主要用到了AsyncTask来进行异步数据的加载李   <李>简单来说,AsyncTask可以看作是一个对处理程序和线程池的封装,通常,AsyncTask主要用于数据简单时,处理器+线程主要用于数据量多且复杂时,当然这也不是必须的,仁者见仁智者见智李   <李>同时,为了避免内存溢出的问题,我们可以在获取网络图片后。对其进行图片压缩李   
     /* *   *三级缓存之网络缓存   */公开课NetCacheUtils {      私人LocalCacheUtils mLocalCacheUtils;   私人MemoryCacheUtils mMemoryCacheUtils;      公共NetCacheUtils (LocalCacheUtils LocalCacheUtils, MemoryCacheUtils MemoryCacheUtils) {   mLocalCacheUtils=localCacheUtils;   mMemoryCacheUtils=memoryCacheUtils;   }/* *   *从网络下载图片   * @param ivPic显示图片的imageview   * @param url下载图片的网络地址   */公共空间getBitmapFromNet (ImageView ivPic,字符串url) {   新BitmapTask ()。执行(ivPic、url);//启动AsyncTask      }/* *   * AsyncTask就是对处理器和线程池的封装   *第一个泛型:参数类型   *第二个泛型:更新进度的泛型   *第三个泛型:onPostExecute的返回结果   */类BitmapTask AsyncTask<延伸;对象,空虚,Bitmap>{      私人ImageView ivPic;   私人字符串url;/* *   *后台耗时操作,存在于子线程中   * @param参数   * @return   */@Override   保护位图doInBackground (Object[]参数){   ivPic=(ImageView) params [0];   url=(字符串)params [1];      返回downLoadBitmap (url);   }/* *   *更新进度,在主线程中   * @param值   */@Override   保护空白>/* *   *三级缓存之本地缓存   */公开课LocalCacheUtils {      私有静态最终字符串CACHE_PATH=Environment.getExternalStorageDirectory () .getAbsolutePath () +“/WerbNews”;/* *   *从本地读取图片   * @param url   */公共位图getBitmapFromLocal(字符串url) {   字符串文件名=零;//把图片的url当做文件名,并进行MD5加密   尝试{   文件名=MD5Encoder.encode (url);   文件文件=新文件(CACHE_PATH文件名);      位图的位图=BitmapFactory.decodeStream(新FileInputStream(文件);      返回位图;   }捕捉(异常e) {   e.printStackTrace ();   }      返回null;   }/* *   *从网络获取图片后,保存至本地缓存   * @param url   * @param位图   */公共空间setBitmapToLocal(字符串url,位图的位图){   尝试{   字符串文件名=MD5Encoder.encode (url);//把图片的url当做文件名,并进行MD5加密   文件文件=新文件(CACHE_PATH文件名);//通过得到文件的父文件,判断父文件是否存在   文件parentFile=file.getParentFile ();   如果(! parentFile.exists ()) {   parentFile.mkdirs ();   }//把图片保存至本地   bitmap.compress (Bitmap.CompressFormat.JPEG 100,新FileOutputStream(文件);   }捕捉(异常e) {   e.printStackTrace ();   }      }   }      

Android图片三级缓存的原理及其实现