由Android缓存设计想到的
2015-04-20 17:59
239 查看
由Android缓存设计想到的
前言
Android这种对内存比较敏感的系统,在处理大量图片的时候不可避免要用到缓存,那么到底是应该使用虚拟机底层通过GC回收保障的SoftReference,还是使用一个带LRU算法的队列,哪个更适合Android系统下的应用?基本概念
缓存,顾名思义把已经读取到的数据存下来,供再次读取,合理的使用缓存可以减少一些昂贵代价的动作(数据库操作,文件读写,网络传输,等),缓解系统压力,提高程序响应速度。设计缓存需要注意的几个方面:缓存的容量,如何使缓存维持在一个合适的大小(过期缓存的处理,超过容量的处理),如何处理并发,等等。
实作
SoftReferenceLRU Queue
Google官方的做法
基于SoftReference实现缓存
这里在根据图片url获取图片并转换成Bitmap时,做两级缓存:一级是内存缓存,这里使用HashMap保存Bitmap的soft引用,key为url;另外一级是持久化缓存,这里用的是文件存储(也可以换成数据库存储)。我们来看一下主要代码:
SoftReference currBitmap = imageCaches.get(url); Bitmap softRefBitmap = null; if (currBitmap != null) { softRefBitmap = currBitmap.get(); } ...... // 先从软引用中拿数据 if (currBitmap != null && mImageView != null && softRefBitmap != null && url.equals(mImageView.getTag())) { mImageView.setImageBitmap(softRefBitmap); } // 软引用中没有,从文件中拿数据 else if (bitmap != null && mImageView != null && url.equals(mImageView.getTag())) { mImageView.setImageBitmap(bitmap); } // 文件中也没有,此时创建线程从网络上获取数据 else if (url != null && needCreateNewTask(mImageView)) { MyAsyncTask task = new MyAsyncTask(url, mImageView, download); if (mImageView != null) { task.execute(); // 将对应的url对应的任务存起来 map.put(url, task); } }
[/code]
相关文章推荐
- 产品设计:Android应用-开发技术【数据缓存】
- 产品设计:Android应用-开发技术【数据缓存】
- 颠覆我对Android图片的理解《android优化那些事之图片缓存设计/如何高效的展示图片(三)》
- Android 位图加载 采样 缓存设计 Bitmap
- android缓存设计
- iOS Android 缓存 设计与优化
- android缓存设计-文件缓存
- Android 三级缓存Cache(内存,文件,网络)图片缓存设计
- android缓存设计
- 产品设计:Android应用-开发技术【数据缓存】
- Android Binder机制の设计与实现6-7(Binder 内存映射和接收缓存区管理/Binder 接收线程管理)
- Android开发笔记——以Volley图片加载、缓存、请求及展示为例理解Volley架构设计
- 产品设计:Android应用-开发技术【数据缓存】
- android 优化那些事之图片缓存设计/如何高效的展示图片(三)
- android volley缓存设计分析
- 【oschina android源码分析】缓存的设计
- 产品设计:Android应用-开发技术【数据缓存】
- Android 二级图片缓存,图片优化,图片异步加载框架设计
- android缓存设计
- androidhttp请求json数据缓存设计