介绍
本文介绍了三级缓存的原理及操作,并且用策略模式的架子框起来。
1.图片的三级缓存是什么
图片的三级缓存顾名思义就是指三级图片的缓存技术,哦,不对,我在说什么。图片的三级缓存顾名思义就是指在图片加载过程中使用缓存技术,在加载网上的图片时,第一次加载时下载图片然后显示,然后会把图片进行缓存操作,之后如果再次使用这个图片时就不用再次下载了,这样子的话可以节约系统资源,也可以节省用户流量。
那么三级缓存是哪三级呢?
- 网络缓存:这一步其实就是利用网络去下载图片的操作,严格说不能算“缓存操作”,但是为了名称的统一,大家就叫它网络缓存。
- 本地缓存:就是说将图片保存在本地SD卡上,使用时直接从SD卡取出就好了。
- 内存缓存:最麻烦的一步,就是将图片保存在内存中,要知道内存缓存是最快的,但是会占用用户内存,所以需要适当的释放内存,后文有具体描述。
2.流程图来一波
我觉得这张图不错,就直接拿来用了,图很好理解,优先从内存中加载,其次是SD卡,内存是最快的,最后才是从网络下载。记得获取到图片以后要相应的存储在缓存中。
3.上代码
代码使用了策略模式封装,如果不了解策略模式的可以去看看本人另一篇关于策略模式的博客。
缓存的抽象父类:
//缓存的抽象类
public abstract class Cache {
abstract Bitmap get(String url) throws IOException;
abstract void put(String url,Bitmap bitmap);
}
所有的缓存类应当有put和get方法,以便存和取。
文件缓存:
public class FileCache extends Cache {
//文件目录
private static final String LOCAL_CACHE_PATH = Environment
.getExternalStorageDirectory().getAbsolutePath() + "/Cache";
private static final String TAG = "ImageDown";
@Override
Bitmap get(String url) {
try {
File cacheFile = new File(LOCAL_CACHE_PATH, MD5Encoder.encode(url));
if (cacheFile.exists()) {
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(
cacheFile));
Log.e(TAG, "get: 图片来源文件");
return bitmap;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
void put(String url, Bitmap bitmap) {
File dir = new File(LOCAL_CACHE_PATH);
if (!dir.exists() || !dir.isDirectory()) {
boolean b = dir.mkdirs();// 创建文件夹
if (!b){
Log.e(TAG, "put: 创建文件夹失败");
}
}