码迷,mamicode.com
首页 > 系统相关 > 详细

Andriod-DiskLruCache的使用案例

时间:2016-03-10 16:08:49      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

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

实现效果图

技术分享

创建DiskLruCache

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

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。

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上显示该图片。

//读取缓存
        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()等方法操作缓存。

本案例源码包含了DiskLruCache的基本使用方法,点击下载

Andriod-DiskLruCache的使用案例

标签:

原文地址:http://blog.csdn.net/leoleohan/article/details/50847209

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!