先给两个超级棒的连接

http://blog.csdn.net/guolin_blog/article/details/28863651Android DiskLruCache完全解析,硬盘缓存的最佳方案

http://blog.csdn.net/guolin_blog/article/details/34093441Android照片墙完整版,完美结合LruCache和DiskLruCache

这是作者对开源项目DiskLruCache的完美总结和实践


同时我们在使用Volley框架的时候,会用到Volley自带的缓存机制,下面方法用来在Volley中自定义二级缓存

package com.android.volley.helper; import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Environment;import android.util.LruCache;import com.android.volley.toolbox.ImageLoader;import com.jakewharton.disklrucache.DiskLruCache;import utils.MD5Utils; import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream; /** * 二级Lru图片缓存, */public class LruImageCache implements ImageLoader.ImageCache {    LruCache<String, Bitmap> lruCache;    DiskLruCache diskLruCache;    final int RAM_CACHE_SIZE = 5 * 1024 * 1024;    String DISK_CACHE_DIR = "image";    final long DISK_MAX_SIZE = 20 * 1024 * 1024;     public LruImageCache() {        this.lruCache = new LruCache<String, Bitmap>(RAM_CACHE_SIZE) {            @Override            protected int sizeOf(String key, Bitmap value) {                return value.getByteCount();            }        };         File cacheDir = new File(Environment.getExternalStorageDirectory(), DISK_CACHE_DIR);        if(!cacheDir.exists())        {            cacheDir.mkdir();        }        try {            diskLruCache = DiskLruCache.open(cacheDir, 1, 1, DISK_MAX_SIZE);        } catch (IOException e) {            e.printStackTrace();        }    }     @Override    public Bitmap getBitmap(String url) {        String key=generateKey(url);        Bitmap bmp = lruCache.get(key);        if (bmp == null) {            bmp = getBitmapFromDiskLruCache(key);            //从磁盘读出后,放入内存            if(bmp!=null)            {                lruCache.put(key,bmp);            }        }        return bmp;    }     @Override    public void putBitmap(String url, Bitmap bitmap) {        String key=generateKey(url);        lruCache.put(url, bitmap);        putBitmapToDiskLruCache(key,bitmap);    }     private void putBitmapToDiskLruCache(String key, Bitmap bitmap) {        try {            DiskLruCache.Editor editor = diskLruCache.edit(key);            if(editor!=null)            {                OutputStream outputStream = editor.newOutputStream(0);                bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);                editor.commit();            }        } catch (IOException e) {            e.printStackTrace();        }    }     private Bitmap getBitmapFromDiskLruCache(String key) {        try {            DiskLruCache.Snapshot snapshot=diskLruCache.get(key);            if(snapshot!=null)            {                InputStream inputStream = snapshot.getInputStream(0);                if (inputStream != null) {                    Bitmap bmp = BitmapFactory.decodeStream(inputStream);                    inputStream.close();                    return bmp;                }            }        } catch (IOException e) {            e.printStackTrace();        }        return null;    }     /**     * 因为DiskLruCache对key有限制,只能是[a-z0-9_-]{1,64},所以用md5生成key     * @param url     * @return     */    private String generateKey(String url)    {        return MD5Utils.getMD532(url);    }}
辅助类:

public class MD5Utils {    public static String hashKeyForDisk(String key) {        String cacheKey;        try {            final MessageDigest mDigest = MessageDigest.getInstance("MD5");            mDigest.update(key.getBytes());            cacheKey = bytesToHexString(mDigest.digest());        } catch (NoSuchAlgorithmException e) {            cacheKey = String.valueOf(key.hashCode());        }        return cacheKey;    }    private static String bytesToHexString(byte[] bytes) {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < bytes.length; i++) {            String hex = Integer.toHexString(0xFF & bytes[i]);            if (hex.length() == 1) {                sb.append('0');            }            sb.append(hex);        }        return sb.toString();    }}

public class VolleyCacheDirUtil {    public static File getDiskCacheDir(Context context, String uniqueName) {        String cachePath;        if (Environment.MEDIA_MOUNTED.equals(Environment                .getExternalStorageState())                || !Environment.isExternalStorageRemovable()) {            cachePath = context.getExternalCacheDir().getPath();        } else {            cachePath = context.getCacheDir().getPath();        }        return new File(cachePath + File.separator + uniqueName);    }}



Volley中操作如下:

 final LruCache<String, Bitmap> lruCache = new LruCache<String, Bitmap>(                20);        ImageCache imageCache = new ImageCache() {            @Override            public void putBitmap(String key, Bitmap value) {                lruCache.put(key, value);            }            @Override            public Bitmap getBitmap(String key) {                return lruCache.get(key);            }        };        ImageLoader imageLoader = new ImageLoader(requestQueue, imageCache);        ImageListener listener = ImageLoader.getImageListener(imageview,                R.drawable.ic_launcher, R.drawable.ic_launcher);        String imageUrl = ConfigEPP.getInstance().mTransferBankIconUrl                + bankName + ".png";        imageLoader.get(imageUrl, listener);


android.googlesource.com/platform/libcore/+/jb-mr2-release/luni/src/main/java/libcore/io/DiskLruCache.java discLruCache路径



更多相关文章

  1. Android清除缓存功能实现
  2. [置顶] 【电子书下载】《Android应用程序开发与典型案例》完整版
  3. Android 【手撕Glide】--Glide缓存机制(面试)
  4. Android Bitmap 的加载和 Cache 缓存 笔记
  5. Android公共库(缓存,下拉ListView,下载管理,Pro 静默安装,root运
  6. Android图片加载与缓存开源框架:Android Glide
  7. 三层缓存机制-新知识点,Android常见的内存缓存算法(LruCache原理
  8. Android 加载图片并存放在缓存中
  9. 【Android网络编程】获取网络图片,具有缓存功能

随机推荐

  1. Android获取ROOT权限
  2. Android调用js的坑
  3. Android搜索建议(搜索联想)
  4. Android(安卓)7.0 移除设置中的某些项(辅
  5. Android(安卓)--- 图片的特效处理
  6. Android(安卓)经典小技巧总结
  7. 第15天android:使用sqlite
  8. Android判断应用是否存在 及 Android(安
  9. Android(安卓)NDK Eclipse 集成
  10. android wpa_supplicant 调试