Andriod DiskLruCache的使用案例

[复制链接]
来自: suisui0614 分类: Android精品源码 上传时间: 2016-4-25 10:54:07
Tag:Andriod DiskLruCache 使用 案例

项目介绍:

DiskLruCache是谷歌推荐的用来实现硬盘缓存的类,本案例将对DiskLruCache的基本用法做一个总结,包括:创建缓存、查找使用缓存、移除缓存等等。

实现效果图

创建DiskLruCache

DiskLruCache使用open方法创建一个实例,如下所示:对应的四个参数分别为:缓存目录、应用版本号、单个key对应的数据的个数(一般设为1)、缓存的总大小,其中key是图片的url经过MD5转码获得的,防止url带有特殊符号影响缓存的正常使用

[Java] 查看源文件 复制代码
try {
            File cacheDir = getDiskCacheDir(this, "bitmap");
            if (!cacheDir.exists()) {
                cacheDir.mkdirs();
            }
            mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(this), 1, 10 * 1024 * 1024);
        } catch (Exception e) {
            e.printStackTrace();
        }

存储缓存

通过DiskLruCache.Editor可以获取到缓存对象的编辑对象editor,类似于SharedPreference的editor。DiskLruCache不允许同时编辑一个缓存对象,如果这个缓存对象正在被编辑,则editor==null。

[Java] 查看源文件 复制代码
new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String key = hashKeyForDisk(imageUrl);
                    DiskLruCache.Editor editor = null;

                    editor = mDiskLruCache.edit(key);
                    if (editor != null) {
                        OutputStream outputStream = editor.newOutputStream(0);
                        if (downloadUrlToStream(imageUrl, outputStream)) {
                            editor.commit();
                        } else {
                            editor.abort();
                        }
                    }
                    //不该频繁的flush,防止journal日志文件的频繁修改
                    mDiskLruCache.flush();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            textView.setText("saveCache done,the bitmap is ready");
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

读取缓存

DiskLruCache.get(String key)方法可以获取到一个Snapshot实例,通过DiskLruCache.Snapshot实例获取缓存文件的输入流,即可在imageView上显示该图片。

[Java] 查看源文件 复制代码
//读取缓存
        try {
            DiskLruCache.Snapshot snapshot = mDiskLruCache.get(hashKeyForDisk(imageUrl));
            if (snapshot != null) {
                InputStream is = snapshot.getInputStream(0);
                Bitmap bitmap = BitmapFactory.decodeStream(is);
                imageView.setImageBitmap(bitmap);
            } else {
                imageView.setImageBitmap(null);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

另外,DiskLruCache还提供了清空缓存delete()、获取缓存目录下的缓存大小size()等方法操作缓存。


相关源码推荐:

我来说两句
所有评论(8)
wangpeiwerty 2016-6-16 18:05:49
膜拜大神~
回复
zhongqiuming 2016-6-16 18:10:18
膜拜大神~
回复
tomsun2283 2016-6-16 18:11:21
学习学习,很有用,感谢~
回复
heyanjiemao 2016-6-16 18:17:58
楼主V5,安卓巴士有你更精彩!
回复
kylin 2016-6-16 18:18:15
学习学习,很有用,感谢~
回复
staruk_ 2016-7-5 17:25:40
楼主威武啊,安卓巴士有你更给力!
回复
pawnluo 2017-5-6 00:55:24
很给力,安卓巴士有你更精彩!
回复
12下一页
提取码:  下载次数:3 状态:已购或VIP 售价:10(原价:10)金钱 下载权限:初级码农 
931 0 3
代码贡献英雄榜
用户名 下载数
联系我们
首页/微信公众账号投稿
帖子代码编辑/版权问题
QQ:435399051,1294855032
如何获得代码达人称号?
如何成为签约作者?
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )