简单实现三级缓存加载图片机制

listview加载大图片总结,当图片数量较多来回滑动有可能导致内存溢出,listview加载图片建议使用Xutils工具,以下内容只是了解即可

文章来源: http://blog.csdn.net/u014368040/article/details/51148542

三级缓存分为内存缓存,本地缓存,网络缓存

  1   内存缓存, 优先加载, 速度最快
  2   本地缓存, 次优先加载, 速度快
  3   网络缓存, 不优先加载, 速度慢,浪费流量

 第一步 自定义MyBitmapUtils


public class MyBitmapUtils {


NetCacheUtils mNetCacheUtils;//网络缓存
LocalCacheUtils mLocalCacheUtils;//本地缓存
MemoryCacheUtils mMemoryCacheUtils;//内存缓存


public MyBitmapUtils() {
mMemoryCacheUtils = new MemoryCacheUtils();
mLocalCacheUtils = new LocalCacheUtils();
mNetCacheUtils = new NetCacheUtils(mLocalCacheUtils, mMemoryCacheUtils);
}


public void display(ImageView ivPic, String url) {
ivPic.setImageResource(R.drawable.news_pic_default);// 设置默认加载图片


Bitmap bitmap = null;
// 从内存读
bitmap = mMemoryCacheUtils.getBitmapFromMemory(url);
if (bitmap != null) {
ivPic.setImageBitmap(bitmap);
System.out.println("从内存读取图片啦...");
return;
}


// 从本地读
bitmap = mLocalCacheUtils.getBitmapFromLocal(url);
if (bitmap != null) {
ivPic.setImageBitmap(bitmap);
System.out.println("从本地读取图片啦...");
mMemoryCacheUtils.setBitmapToMemory(url, bitmap);// 将图片保存在内存
return;
}


// 从网络读
mNetCacheUtils.getBitmapFromNet(ivPic, url);
}


}



第二步:



/**
 * 网络缓存
 */
public class NetCacheUtils {


private LocalCacheUtils mLocalCacheUtils;
private MemoryCacheUtils mMemoryCacheUtils;


public NetCacheUtils(LocalCacheUtils localCacheUtils,
MemoryCacheUtils memoryCacheUtils) {
mLocalCacheUtils = localCacheUtils;
mMemoryCacheUtils = memoryCacheUtils;
}


/**
* 从网络下载图片

* @param ivPic
* @param url
*/
public void getBitmapFromNet(ImageView ivPic, String url) {
new BitmapTask().execute(ivPic, url);// 启动AsyncTask,
// 参数会在doInbackground中获取
}


/**
* Handler和线程池的封装

* 第一个泛型: 参数类型 第二个泛型: 更新进度的泛型, 第三个泛型是onPostExecute的返回结果
*/
class BitmapTask extends AsyncTask<Object, Void, Bitmap> {


private ImageView ivPic;
private String url;


/**
* 后台耗时方法在此执行, 子线程
*/
@Override
protected Bitmap doInBackground(Object... params) {
ivPic = (ImageView) params[0];
url = (String) params[1];


ivPic.setTag(url);// 将url和imageview绑定


return downloadBitmap(url);
}


/**
* 更新进度, 主线程
*/
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}


/**
* 耗时方法结束后,执行该方法, 主线程
*/
@Override
protected void onPostExecute(Bitmap result) {
if (result != null) {
String bindUrl = (String) ivPic.getTag();


if (url.equals(bindUrl)) {// 确保图片设定给了正确的imageview
ivPic.setImageBitmap(result);
mLocalCacheUtils.setBitmapToLocal(url, result);// 将图片保存在本地
mMemoryCacheUtils.setBitmapToMemory(url, result);// 将图片保存在内存
System.out.println("从网络缓存读取图片啦...");
}
}
}
}


/**
* 下载图片
*/
private Bitmap downloadBitmap(String url) {


HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL(url).openConnection();


conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
conn.connect();


int responseCode = conn.getResponseCode();
if (responseCode == 200) {
InputStream inputStream = conn.getInputStream();

//图片压缩处理
BitmapFactory.Options option = new BitmapFactory.Options();
option.inSampleSize = 2;//宽高都压缩为原来的二分之一, 此参数需要根据图片要展示的大小来确定
option.inPreferredConfig = Bitmap.Config.RGB_565;//设置图片格式

Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, option);
return bitmap;
}


} catch (Exception e) {
e.printStackTrace();
} finally {
conn.disconnect();
}


return null;
}


}




第三步:



/**
 * 本地缓存
 */
public class LocalCacheUtils {


public static final String CACHE_PATH = Environment
.getExternalStorageDirectory().getAbsolutePath() + "/wenya_cache";


/**
* 从本地sdcard读图片
*/
public Bitmap getBitmapFromLocal(String url) {
try {
String fileName = MD5Encoder.encode(url);//用到MD5工具
File file = new File(CACHE_PATH, fileName);


if (file.exists()) {
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(
file));
return bitmap;
}


} catch (Exception e) {
e.printStackTrace();
}


return null;
}


/**
* 向sdcard写图片

*/
public void setBitmapToLocal(String url, Bitmap bitmap) {
try {
String fileName = MD5Encoder.encode(url);


File file = new File(CACHE_PATH, fileName);


File parentFile = file.getParentFile();
if (!parentFile.exists()) {// 如果文件夹不存在, 创建文件夹
parentFile.mkdirs();
}


// 将图片保存在本地
bitmap.compress(CompressFormat.JPEG, 100,
new FileOutputStream(file));
} catch (Exception e) {
e.printStackTrace();
}


}
}



第四步:



/**
 * 内存缓存
 */
public class MemoryCacheUtils {


// private HashMap<String, SoftReference<Bitmap>> mMemoryCache = new
// HashMap<String, SoftReference<Bitmap>>();
private LruCache<String, Bitmap> mMemoryCache;


public MemoryCacheUtils() {
long maxMemory = Runtime.getRuntime().maxMemory() / 8;// 模拟器默认是16M
mMemoryCache = new LruCache<String, Bitmap>((int) maxMemory) {//用到LruCache
@Override
protected int sizeOf(String key, Bitmap value) {
int byteCount = value.getRowBytes() * value.getHeight();// 获取图片占用内存大小
return byteCount;
}
};
}


/**
* 从内存读
*/
public Bitmap getBitmapFromMemory(String url) {
// SoftReference<Bitmap> softReference = mMemoryCache.get(url);
// if (softReference != null) {
// Bitmap bitmap = softReference.get();  软引用 android2.3后被谷歌废弃了
// return bitmap;
// }
return mMemoryCache.get(url);
}


/**
* 写内存
*/
public void setBitmapToMemory(String url, Bitmap bitmap) {
// SoftReference<Bitmap> softReference = new
// SoftReference<Bitmap>(bitmap);
// mMemoryCache.put(url, softReference);
mMemoryCache.put(url, bitmap);
}
}




调用private MyBitmapUtils utils;

utils = new MyBitmapUtils();

        utils.display(holder.ivpic, item.listimage);

个人总结,了解即可!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值