<强>为什么要使用三级缓存强>
-
<李>如今的安卓应用经常会需要网络交互,通过网络获取图片是再正常不过的事了李>
<李>假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非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图片三级缓存的原理及其实现