AndroidStudio利用DiskLruCache和LruCache实现简单的照片墙

(1)主界面是一个GridView, 主要机制都实现在gridview中.
(2)核心成员

//记录下载任务
private Set<BitmapWorkerTask> taskCollection;


//内存缓存
private LruCache<String, Bitmap> mMemoryCache;

//硬盘缓存
private DiskLruCache mDiskLruCache;

(3)实现过程
<1>在adaper中对LruCache和DiskLruCache进行初始化:

        // 获取应用程序最大可用内存
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int cacheSize = maxMemory / 8;  //134217728byte = 128M
        // 设置图片缓存大小为程序最大可用内存的1/8
        mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getByteCount();
            }
        };
        try {
            // 获取图片缓存路径
            File cacheDir = getDiskCacheDir(context, "thumb");
            if (!cacheDir.exists()) {
                cacheDir.mkdirs();
            }
            // 创建DiskLruCache实例,初始化缓存数据
            mDiskLruCache = DiskLruCache
                    //缓存地址, 版本号(当版本号变化会自动清理缓存的), 一个key对应几个文件, 缓存容量
                    .open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024);//10M
        } catch (IOException e) {
            e.printStackTrace();
        }

<2>在getview中进行image关联, 先设置一个空照片, 当下载之后, 利用图片的url作为tag找个这个imageview进行更新.
        imageView.setTag(url);
        imageView.setImageResource(R.drawable.empty_photo);
        loadBitmaps(imageView, url);
<3>加载图片

a.创建一个下载图片的AsyncTask<String, Void, Bitmap>, 参数是url, 空, 返回类型.

b.在这里进行图片下载, 下载的过程实际是将网上图片保存到硬盘缓存的过程,下载完成之后 将文件保存到内存缓存中, 同时将下载
任务从taskset中取出.下载成功的task不需要监控了.
c.硬盘缓存的key是图片url的hash值, 因为直接用url当文件名可能有非法字符. 内存缓存就可以直接用url当key了.
d.下载完成从内存缓存中取出image,设置到imageview上就可以了
            ImageView imageView = (ImageView) mphotowall.findViewWithTag(imageUrl);
            if (imageView != null && bitmap != null) {
                imageView.setImageBitmap(bitmap);
            }
            taskCollection.remove(this);
        }
源码下载: 点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值