Andriod DiskLruCache的使用案例

Posted cxchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Andriod DiskLruCache的使用案例相关的知识,希望对你有一定的参考价值。

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的使用案例的主要内容,如果未能解决你的问题,请参考以下文章

硬盘缓存方案DiskLruCache源码解析

DiskLruCache 硬盘缓存 使用简介

使用LruCache和DiskLruCache手写一个ImageLoader

硬盘缓存方案DiskLruCache源代码解析

Android照片墙完整版,完美结合LruCache和DiskLruCache

来自 android 教程的 DiskLruCache 缺少很多方法。