Android 加载图片优化(二) LruCache DiskLruCache
2016-02-01 01:16
495 查看
LruCache(内存缓存)
DiskLruCache(磁盘缓存)
1.创建diskLruCache 对象
cacheDir 数据缓存目录
appVersion 当前软件的版本号 一般为1
valueCount 一个key可以保存多少个文件 一般为1
DISK_CACHE_SIZE 磁盘的缓存地址
2.cacheDir 获取缓存目录
3.将下载地址用md5加密避免特殊字符 然后作为缓存的key 并且得到DiskLruCache.Editor实例
4.通过DiskLruCache.Editor的实例,调用它的newOutputStream()方法来创建一个输出流,并把它传入到downloadUrlToStream()中就能实现下载并写入缓存的功能了。
注意newOutputStream()方法接收一个index参数,由于前面在设置valueCount的时候指定的是1,所以这里index传0就可以了。在写入操作执行完之后,我们还需要调用一下commit()方法进行提交才能使写入生效,调用abort()方法的话则表示放弃此次写入。
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();
相关文章推荐
- [android]_[handler的简单使用]
- Android-聊天窗口实现
- 《Android开发艺术探索》读书笔记 (2) 第2章 IPC机制
- Android学习路线
- Android问题解决记录—android.content.res.Resources$NotFoundException: Unable to find resource ID
- Android 判断签名MD5——防止二次打包
- Android activity_main.xml文件中的FrameLayout
- Android 一张图理解getWidth和getMeasuredWidth
- android:gravity与android:layout_gravity
- Android Studio JNI开发
- android框架
- 赤兔安卓版语音图片资料处理
- php-5.5.1-android.patch.v3
- cBPM-android - Code::Blocks环境搭建
- viewpager切换动画
- 选择蜂窝教育Android培训 成就未来
- Android调用默认浏览器打开指定Url的方法实例
- Android NDK and pthread
- Port Node.js to Android running on Genymotion Emulator (x86)
- android— javascript/HTML5/JS read/write local file