zoukankan      html  css  js  c++  java
  • Android 加载图片优化(二) LruCache DiskLruCache

    LruCache(内存缓存)

    DiskLruCache(磁盘缓存)

    1.创建diskLruCache 对象

    private static DiskLruCache diskLruCache = DiskLruCache.open(cacheDir, appVersion, valueCount, DISK_CACHE_SIZE);

      cacheDir  数据缓存目录

      appVersion 当前软件的版本号  一般为1

      valueCount 一个key可以保存多少个文件  一般为1

      DISK_CACHE_SIZE 磁盘的缓存地址

    2.cacheDir 获取缓存目录

    private File getDiskCacheDir(){
            String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())||
                    !Environment.isExternalStorageRemovable()?context.getExternalCacheDir().getPath()
                    :context.getCacheDir().getPath();
            Log.i("getDiskCacheDir",cachePath+File.separator+DISK_CACHE_SUBDIR);
            return new File(cachePath+File.separator+DISK_CACHE_SUBDIR);
        }
    
    File cacheDir = getDiskCacheDir();

    3.将下载地址用md5加密避免特殊字符 然后作为缓存的key 并且得到DiskLruCache.Editor实例

    String imageUrl = "http://10.2.2.1/img.jpg";  
    String key = hashKeyForDisk(imageUrl);  
    DiskLruCache.Editor editor = mDiskLruCache.edit(key);

    4.通过DiskLruCache.Editor的实例,调用它的newOutputStream()方法来创建一个输出流,并把它传入到downloadUrlToStream()中就能实现下载并写入缓存的功能了。

       注意newOutputStream()方法接收一个index参数,由于前面在设置valueCount的时候指定的是1,所以这里index传0就可以了。在写入操作执行完之后,我们还需要调用一下commit()方法进行提交才能使写入生效,调用abort()方法的话则表示放弃此次写入。

    new Thread(new Runnable() {  
        @Override  
        public void run() {  
            try {  
                String imageUrl = "http://10.2.2.1/img.jpg";  
                String key = hashKeyForDisk(imageUrl);  
                DiskLruCache.Editor editor = mDiskLruCache.edit(key);  
                if (editor != null) {  
                    OutputStream outputStream = editor.newOutputStream(0);  
                    if (downloadUrlToStream(imageUrl, outputStream)) {  
                        editor.commit();  
                    } else {  
                        editor.abort();  
                    }  
                }  
                mDiskLruCache.flush();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }).start();  
  • 相关阅读:
    PHP利用CURL_MULTI实现多线程
    PHP也玩并发,巧用curl 并发减少后端访问时间
    Mysql 地区经纬度 查询
    Cron表达式简单学习
    定时任务实现
    Android ListView简单实用
    关于分布式事物 转
    关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载
    数据库范式
    配置org.springframework.scheduling.quartz.CronTriggerBean (转载)
  • 原文地址:https://www.cnblogs.com/qingducx/p/5174286.html
Copyright © 2011-2022 走看看