Android开发必备技能之:Android中图片的三级缓存实现

为什么要使用三级缓存

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

什么是三级缓存

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

三级缓存原理

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

具体实现及代码

1. 自定义的图片缓存工具类(MyBitmapUtils)
  • 通过new MyBitmapUtils().display(ImageView ivPic, String url) 提供给外部方法进行图片缓存的接口
  • 参数含义:ivPic 用于显示图片的ImageView,url 获取图片的网络地址
    /**
     * 自定义的BitmapUtils,实现三级缓存
     */
    public class MyBitmapUtils {

        private NetCacheUtils mNetCacheUtils;
        private LocalCacheUtils mLocalCacheUtils;
        private MemoryCacheUtils mMemoryCacheUtils;

        public MyBitmapUtils(){
            mMemoryCacheUtils=new MemoryCacheUtils();
            mLocalCacheUtils=new LocalCacheUtils();
            mNetCacheUtils=new NetCacheUtils(mLocalCacheUtils,mMemoryCacheUtils);
        }

        public void disPlay(ImageView ivPic, String url) {
            ivPic.setImageResource(R.mipmap.pic_item_list_default);
            Bitmap bitmap;
            //内存缓存
            bitmap=mMemoryCacheUtils.getBitmapFromMemory(url);
            if (bitmap!=null){
                ivPic.setImageBitmap(bitmap);
                System.out.println("从内存获取图片啦.....");
                return;
            }

            //本地缓存
            bitmap = mLocalCacheUtils.getBitmapFromLocal(url);
            if(bitmap !=null){
                ivPic.setImageBitmap(bitmap);
                System.out.println("从本地获取图片啦.....");
                //从本地获取图片后,保存至内存中
                mMemoryCacheUtils.setBitmapToMemory(url,bitmap);
                return;
            }
            //网络缓存
            mNetCacheUtils.getBitmapFromNet(ivPic,url);
        }
    }
2. 网络缓存(NetCacheUtils)
  • 网络缓存中主要用到了AsyncTask来进行异步数据的加载
  • 简单来说,AsyncTask可以看作是一个对handler和线程池的封装,通常,AsyncTask主要用于数据简单
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值