二级缓存
网络加载完数据以后再将数据存储在本地缓存的目录下。
应用在调用的时候,先判断是否有本地缓存,然后再考虑是否进行网络访问。
二级缓存实现方法
由于需要访问文件夹,所以需要在ManiFest处开通相关的权限,如果是6.0的机器,需要动态访问相关的权限。
加载图片类
public class MyBitMapUtils {
private NetCaCheUtils mNetCaCheUtils;
private LocalCaCheUtils mLocalCacheUtils;
public MyBitMapUtils(String tag) {
mLocalCacheUtils = new LocalCaCheUtils();
mNetCaCheUtils = new NetCaCheUtils(tag, mLocalCacheUtils);
}
public void display(ImageView mImage, String url) {
//本地加载图片
try {
Bitmap bitmap = mLocalCacheUtils.getLocaCache(url);
if (bitmap != null) {
mImage.setImageBitmap(bitmap);
Log.d(TAG, "display: " + "有本地缓存了");
return;
}
} catch (Exception e) {
e.printStackTrace();
}
//网络加载图片
mNetCaCheUtils.getBitMapFromNet(mImage, url);
}
}
本地缓存类
public class LocalCaCheUtils {
private static final String LOCAL_CACHE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/zhbj_cache";
//写本地缓存
public void setLocalCache(String url, Bitmap bitmap) {
File dir = new File(LOCAL_CACHE_PATH);
if (!dir.exists() || !dir.isDirectory()) {
dir.mkdirs();//创建文件夹
}
try {
String fileName = MD5Encoder.encode(url);
File cacheFile = new File(dir, fileName);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(cacheFile));
} catch (Exception e) {
e.printStackTrace();
}
}
//读本地缓存
public Bitmap getLocaCache(String url) throws Exception {
File cacheFile = new File(LOCAL_CACHE_PATH, MD5Encoder.encode(url));
if (cacheFile.exists()) {
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(cacheFile));
return bitmap;
} else {
return null;
}
}
}
网络缓存类
public class NetCaCheUtils {
private ImageView imageView;
private String url;
private String tag;
private LocalCaCheUtils mLocalCaCheUtils;
/**
* 传递settag的标识
*
* @param tag
* @param mLocalCacheUtils
*/
public NetCaCheUtils(String tag, LocalCaCheUtils mLocalCacheUtils) {
mLocalCaCheUtils=new LocalCaCheUtils();
this.tag = tag;
}
/**
* 提供设置图片的方法
* 传递两个参数
*
* @param mImage recycleview的view
* @param url 下载地址
*/
public void getBitMapFromNet(ImageView mImage, String url) {
imageView = mImage;
new BitMapTask().execute(mImage, url);
}
/**
* 异步加载的方法
*/
class BitMapTask extends AsyncTask<Object, Integer, Bitmap> {
/**
* 调用前使用的方法
* 主线程运行
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/**
* 后台运行,在子线程运行
*
* @param params
* @return
*/
@Override
protected Bitmap doInBackground(Object[] params) {
imageView = (ImageView) params[0];
url = (String) params[1];
//下载图片
Bitmap bitmap = null;
try {
bitmap = download(url);
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
/**
* 主线程运行,用于更新主线程UI
*
* @param result
*/
@Override
protected void onPostExecute(Bitmap result) {
if (result != null) {
imageView.setImageBitmap(result);
try {
mLocalCaCheUtils.setLocalCache(url,result);
} catch (Exception e) {
e.printStackTrace();
}
Log.d(TAG, "onPostExecute: 网络加载缓存了");
}
}
//更新下载进度
@Override
protected void onProgressUpdate(Integer[] values) {
super.onProgressUpdate(values);
}
}
/**
* 从网络下载图片的方法
* @param url
* @return
* @throws IOException
*/
public Bitmap download(String url) throws IOException {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
InputStream inputStream = conn.getInputStream();
//根据输入流生成一个bitmap
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
if (conn != null) {
conn.disconnect();
}
return null;
}
}