1000张图片,你怎么解决??一次加载OOM指日可待
今天来学习一下什么是三级缓存!!
1.内存缓存Cache
2.文件缓存File(I/O)
3.网络加载
1),AndroidMainfest加上权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />//读写
<uses-permission android:name="android.permission.INTERNET" />//连网
接下来CaCheUtil,缓存工具类
2)构造方法
private static LruCache<String, Bitmap> mCache;// 缓存池
private Context context;
private static CaCheUtil c;
private String path;
private CaCheUtil(Context context, int size) {
this.context = context;
path="文件制定路径";
if (size == 0)
size = 10 * 1024 * 1024;// 默认10M内存缓存池
mCache = new LruCache<String, Bitmap>(size) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
3)工具对象的单例模式
public static CaCheUtil getInstance(Context context, int size) {
if (c != null)
return c;
else
return new CaCheUtil(context, size);
}
4)内存缓存
// 1.内存缓存
private Bitmap getBitmap(String url) {//获取图片
return mCache.get(url);
}
public void putBitmap(String url, Bitmap bitmap) {//放入图片
mCache.put(url, bitmap);
}
5)文件缓存
//2.文件缓存
private void putToFile(String name,Bitmap bitmap) throws IOException{
//这个是APP下的缓存,如果有限制,可以换成内存卡
File file=new File(path+"/"+name);
if(!file.exists()){
file.createNewFile();
}else{
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);//将图片写入文件1.图片格式2.压缩率,3.输出流
out.flush();
out.close();
}
}
private Bitmap getForFile(String name) throws IOException{
File file=new File(path+"/"+name);
Bitmap bm=null;
if(!file.exists()){
//未找到相关文件
}else if(file.isFile()){
bm=BitmapFactory.decodeFile(file.getAbsolutePath());
//存入内存
putBitmap(file.getAbsolutePath(), bm);
}
return bm;
}
6)网络加载
//3.网络加载
private void downToHttp(final String url,final DownCallback callback){
//异步线程
AsyncTask<Void, Void, Bitmap> httpTask=new AsyncTask<Void, Void, Bitmap>(){
@Override
protected Bitmap doInBackground(Void... arg0) {
try {
//1.发送网络请求
//TODO 这个自己调用下
String name="文件名";
Bitmap bitmap=null;
//2.文件缓存
putToFile(name,bitmap);
//3.内存缓存
putBitmap(path+"/"+name, bitmap);
callback.onRequest(bitmap);//回调图片对象
} catch (IOException e) {
}
return null;
}
};
httpTask.execute();//启动
}
7)获取图片,这是一个公开的方法,通过这个方法,这个类就结束了
/**
* 获取图片
* @param url 网络加载地址
* @param name 文件名称(用于在缓存池中找对应的资源,和存入文件的文件名称)
* @param bacllback 返回结果的回调接口
* @throws IOException
*/
public void getBitmap(String url,String name,DownCallback callback) throws IOException{
Bitmap bitmap=null;
if(name!=null&&"".equals(name)){
bitmap=getBitmap(name);//1.从缓存池找
if(bitmap!=null){
callback.onRequest(bitmap);
return;
}else{
bitmap=getForFile(name);//2.从文件目录中找
if(bitmap!=null){
callback.onRequest(bitmap);
return;
}else{
downToHttp(url, callback);//3.网络加载
return;
}
}
}
}
8)加上回调接口
public interface DownCallback {
void onRequest(Object object);
}
9)注册,调用
CaCheUtil util=CaCheUtil.getInstance(this, 0);
//最好在application中注册已有一个
try {
util.getBitmap("网络路径","文件名",new DownCallback() {
@Override
public void onRequest(Object object) {
if(object !=null);
Bitmap bm=(Bitmap) object;
//获取资源 开始设置
}
} );
} catch (IOException e) {
e.printStackTrace();
}