您的位置:首页 > 移动开发 > Android开发

读Android开发艺术探索笔记(LruCache+DiskLruCache实现强大的图片加载)

2016-11-19 09:31 471 查看
LruCache用于实现内存缓存,DiskLruCache充当了存储设备缓存也就是存储到SD卡。

LruCache:

    初始化LruCache:

        private int maxMemory =
(int) (Runtime.getRuntime().maxMemory()
/ 1024);

    private int cacheSize maxMemory / 8;

    private LruCache<String,
Bitmap> myCache new LruCache<String,
Bitmap>(cacheSize) {

@Override
protected int sizeOf(String key, Bitmap value) {

return value.getRowBytes() * value.getHeight() / 1024;

}
//源码中该方法是一个空实现,可以在此做一些对象回收工作
@Override
protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {

}
};

   将Bitmap存储缓存中:

       public void addBitmapToMemoryCache(String key, Bitmap bitmap) {

if (getBitmapFromMemoryCache(key) == null) {
myCache.put(key, bitmap);
}
}

从缓存中获取Bitmap对象:

public Bitmap getBitmapFromMemoryCache(String key) {

return myCache.get(key);
}



DiskLruCache:
    DiskLruCache的open方法:用于创建DiskLruCache对象
        DiskLruCache.open(diskCacheDir, 1, 1, DISK_CACHE_SIZE);

    open()方法接收四个参数,第一个参数指定的是数据的缓存地址,第二个参数指定当前应用程序的版本号,第三个参数指定同一个key可以对应多少个缓存文件,基本都是传1,第四个参数指定最多可以缓存多少字节的数据
    Snapshot:封装了从DiskLruCacge中获取的一个文件对象,可以从区获取文件的输入流,进而获得文件。
    DiskLruCache.Snapshot snapshot = mDiskLruCache.get(key);

if (snapshot != null) {
FileInputStream fileInputStream = (FileInputStream) snapshot.getInputStream(DISK_CACHE_INDEX);
FileDescriptor fileDescriptor = fileInputStream.getFD();
Bitmap bitmap = BitmapUtil.decodeSampledBitmapFromFileDescriptor(fileDescriptor, reqWidth, reqHeight); 

  Editor:DiskLruCache的缓存的添加操作是通过Editor完成的,Editor表示一个缓存对象的编辑对象。

    因为每个实体都是个文件,所以你可以认为这个os指向一个文件的FileOutputStream,然后把你想存的东西写入就行了,写完以后记得调用:
editor.commit()


源码链接:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息