由Android缓存设计想到的

由Android缓存设计想到的

前言

Android这种对内存比较敏感的系统,在处理大量图片的时候不可避免要用到缓存,那么到底是应该使用虚拟机底层通过GC回收保障的SoftReference,还是使用一个带LRU算法的队列,哪个更适合Android系统下的应用?

基本概念

缓存,顾名思义把已经读取到的数据存下来,供再次读取,合理的使用缓存可以减少一些昂贵代价的动作(数据库操作,文件读写,网络传输,等),缓解系统压力,提高程序响应速度。

设计缓存需要注意的几个方面:缓存的容量,如何使缓存维持在一个合适的大小(过期缓存的处理,超过容量的处理),如何处理并发,等等。

实作

  • SoftReference
  • LRU Queue
  • Google官方的做法

基于SoftReference实现缓存

这里在根据图片url获取图片并转换成Bitmap时,做两级缓存:一级是内存缓存,这里使用HashMap保存Bitmap的soft引用,key为url;另外一级是持久化缓存,这里用的是文件存储(也可以换成数据库存储)。
我们来看一下主要代码:


    SoftReference currBitmap = imageCaches.get(url);
        Bitmap softRefBitmap = null;
        if (currBitmap != null) {
            softRefBitmap = currBitmap.get();
        }
......
// 先从软引用中拿数据
        if (currBitmap != null && mImageView != null && softRefBitmap != null
                && url.equals(mImageView.getTag())) {
            mImageView.setImageBitmap(softRefBitmap);
        }
        // 软引用中没有,从文件中拿数据
        else if (bitmap != null && mImageView != null
                && url.equals(mImageView.getTag())) {
            mImageView.setImageBitmap(bitmap);
        }
        // 文件中也没有,此时创建线程从网络上获取数据
        else if (url != null && needCreateNewTask(mImageView)) {
            MyAsyncTask task = new MyAsyncTask(url, mImageView, download);
            if (mImageView != null) {

                task.execute();
                // 将对应的url对应的任务存起来
                map.put(url, task);
            }
        }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值