zoukankan      html  css  js  c++  java
  • 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的基本用法,点击下载

  • 相关阅读:
    Select与Epoll的区别
    C++ 多态详解及常见面试题
    Linux进程状态详解及状态转换
    C++ 设计模式之单例模式
    DS 图解归并排序
    TCP三次握手,四次挥手详解及常见面试题
    Linux 进程间通信(管道、共享内存、消息队列、信号量)
    # maven
    # select sort 选择排序
    # gitlab与git私钥公钥
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7215813.html
Copyright © 2011-2022 走看看