LruCache和DiskLruCache优化网络异步加载图片
2015-11-12 18:14
513 查看
1. 使用DiskLruCache磁盘缓存网络下载的图片
2. 使用LruCache加载图片到内存
处理逻辑:
1. 优先加载LruCache中的图片,第一步检查LruCahce
2. 第二步检查磁盘缓存DiskLruCache,存在则加入LruCahce,没有则执行第三步
3. 第三步,都没有则去网络下载,下载完成后加入磁盘缓存,更新界面
LruCache用法
DiskLruCache用法
2. 使用LruCache加载图片到内存
处理逻辑:
1. 优先加载LruCache中的图片,第一步检查LruCahce
2. 第二步检查磁盘缓存DiskLruCache,存在则加入LruCahce,没有则执行第三步
3. 第三步,都没有则去网络下载,下载完成后加入磁盘缓存,更新界面
LruCache用法
private LruCache<Integer, Bitmap> lruCache; public void addBitmapToMemoryCache(Integer key, Bitmap bitmap) { if (getBitmapFromMemCache(key) == null) { lruCache.put(key, bitmap); } } public Bitmap getBitmapFromMemCache(Integer key) { return lruCache.get(key); }
DiskLruCache用法
public class DiskCacheManager { private Context context; /** 磁盘缓存 */ private DiskLruCache diskCache; /** cache大小,默认10M */ private final int MAX_CACHE_SIZE = 10 * 1024 * 1024; private static DiskCacheManager diskCacheManager; private DiskCacheManager() { context = ISApplication.getInstance(); initDiskCache(); } public static DiskCacheManager getInstance() { if (diskCacheManager == null) { diskCacheManager = new DiskCacheManager(); } return diskCacheManager; } private boolean initDiskCache() { try { File cacheDir = Enviroment.getInstance().getDiskCacheDir(context, "bitmap"); if (!cacheDir.exists()) { cacheDir.mkdirs(); } diskCache = DiskLruCache.open(cacheDir, SystemUtils.getVersionCode(context), 1, MAX_CACHE_SIZE); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 创建编辑器 * DiskLruCache.Editor editor = diskCache.edit(key); * 打开输出流 * OutputStream output = editor.newOutputStream(0); * output.write(); * output.flush(); * 提交 * editor.commit(); * @return */ public DiskLruCache getDiskCache() { if (diskCache == null || diskCache.isClosed()) { initDiskCache(); } return diskCache; } public boolean isClosed() { if (diskCache != null) { return diskCache.isClosed(); } return true; } public void closeCache() { if (diskCache == null) { return; } if (diskCache.isClosed()) { return; } try { diskCache.close(); diskCache = null; } catch (IOException e) { e.printStackTrace(); } } }
<pre name="code" class="java"> private DiskLruCache diskCache; diskCache = DiskCacheManager.getInstance().getDiskCache(); try { String cacheKey = String.valueOf(uid); Snapshot snapShot = diskCache.get(cacheKey); if (snapShot != null) { // 存在缓存,读取缓存 InputStream input = snapShot.getInputStream(0); Bitmap bmp = BitmapFactory.decodeStream(input); if (bmp != null) { scaleBitmap(bmp); } } } catch (Exception e) { e.printStackTrace(); } // 编辑 DiskLruCache.Editor editor = diskCache.edit(cacheKey); OutputStream output = null; try { if (editor != null) { output = editor.newOutputStream(0); byte[] data = BitmapUtils.bitmap2Bytes(bitmap); output.write(data); output.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (output != null) { output.close(); editor.commit(); } } catch (Exception e2) { e2.printStackTrace(); } }
相关文章推荐
- ahjesus在asp.net中还可以通过设置HttpCookie对象的过期时间为DateTime.MinValue来指定此Cookies为跟随浏览器生效
- python SimpleHTTPServer
- 网络七层详解
- 文章标题
- 网络连接形象比喻
- 协议分析
- 企业内部常用网络架构
- 通过HttpModule控制功能权限与异常处理
- (PHP)用cURL访问HTTPS资源
- asp.net中处理程序调用HttpContext.Current.Session获取值出错
- Android 播放网络视频,视频流的处理
- iptables中的 -m tcp的意思
- iOS中使用 Reachability 检测网络区分手机网络类型 WiFi 和2 3 4 G
- SNMP协议
- Http状态码集合
- muduo库阅读(42)——Net部分:TCP客户端TcpClient
- 网络流量测试方法
- Android 使用HttpURLConnection 下载
- 隐身术——使用Tor匿名网络与proxychains构建SOCKS代理链IP跳板,在***测试与******时销声匿迹
- ios AFHTTPSessionManger下载补充