android中图片异步加载工具类 ---利用双缓存技术和线程池
来源:互联网 发布:淘宝换手机屏幕可靠么 编辑:程序博客网 时间:2024/04/27 12:19
图片的异步加载是在android中的经常用的技术,android提供的源码中也有图片异步加载的工具类,可是一般只是利用了软缓存的技术,也就是将图片直接缓存在内存之中而已,当内存不足的时候缓存中的图片会被清除掉.现在,我们将图片同时缓存在内存和SD卡中,这个可以同时做到内存不足的时候也能不去再一次去请求下载网络图片,减少流量!好了,废话不说,直接上代码!
import java.io.File;
import java.io.IOException;
import java.lang.ref.SoftReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import net.oschina.app.AppException;
import net.oschina.app.api.ApiClient;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
/**
* 异步线程加载图片工具类 利用线程池和双缓存
*
* @author chenkb
*
*/
public class BitmapManager {
private static HashMap<String, SoftReference<Bitmap>> cache; //软存
private static ExecutorService pool; //线程池
private static Map<ImageView, String> imageViews;
private Bitmap defaultBmp; //默认加载的图片
static {
cache = new HashMap<String, SoftReference<Bitmap>>();
pool = Executors.newFixedThreadPool(5);
imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
}
public BitmapManager(){}
public BitmapManager(Bitmap def) {
this.defaultBmp = def;
}
/**
* 设置默认图片
* @param bmp
*/
public void setDefaultBmp(Bitmap bmp) {
defaultBmp = bmp;
}
/**
* 加载图片
* @param url
* @param imageView
*/
public void loadBitmap(String url, ImageView imageView) {
loadBitmap(url, imageView, this.defaultBmp, 0, 0);
}
/**
* 加载图片-可设置加载失败后显示的默认图片
* @param url
* @param imageView
* @param defaultBmp
*/
public void loadBitmap(String url, ImageView imageView, Bitmap defaultBmp) {
loadBitmap(url, imageView, defaultBmp, 0, 0);
}
/**
* 加载图片-可指定显示图片的高宽
* @param url
* @param imageView
* @param width
* @param height
*/
public void loadBitmap(String url, ImageView imageView, Bitmap defaultBmp, int width, int height) {
imageViews.put(imageView, url);
Bitmap bitmap = getBitmapFromCache(url);
if (bitmap != null) {
//显示缓存图片
imageView.setImageBitmap(bitmap);
} else {
//加载SD卡中的图片缓存
String filename = "";//存储在sd卡中文件名
String filepath = "";//sd卡中的图片路径,请换成自己的图片路径
File file = new File(filepath);
if(file.exists()){
//显示SD卡中的图片缓存
Bitmap bmp = "";//从sd卡中获得图片,具体的方法根据个人习惯实现
imageView.setImageBitmap(bmp);
}else{
//线程加载网络图片
imageView.setImageBitmap(defaultBmp);
queueJob(url, imageView, width, height);
}
}
}
/**
* 从缓存中获取图片
* @param url
*/
public Bitmap getBitmapFromCache(String url) {
Bitmap bitmap = null;
if (cache.containsKey(url)) {
bitmap = cache.get(url).get();
}
return bitmap;
}
/**
* 从网络中加载图片
* @param url
* @param imageView
* @param width
* @param height
*/
public void queueJob(final String url, final ImageView imageView, final int width, final int height) {
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
String tag = imageViews.get(imageView);
if (tag != null && tag.equals(url)) {
if (msg.obj != null) {
imageView.setImageBitmap((Bitmap) msg.obj);
try {
//向SD卡中写入图片缓存
//在这里添加写入sd卡的方法
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
};
pool.execute(new Runnable() {
public void run() {
Message message = Message.obtain();
message.obj = downloadBitmap(url, width, height);
handler.sendMessage(message);
}
});
}
/**
* 下载图片-可指定显示图片的高宽
* @param url
* @param width
* @param height
*/
private Bitmap downloadBitmap(String url, int width, int height) {
Bitmap bitmap = null;
try {
//http加载图片
bitmap = "";//url下载,根据个人习惯来
if(width > 0 && height > 0) {
//指定显示图片的高宽
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
}
//放入缓存
cache.put(url, new SoftReference<Bitmap>(bitmap));
} catch (AppException e) {
e.printStackTrace();
}
return bitmap;
}
}
最后是调用:
BitmapManager bmpManager = new BitmapManager(BitmapFactory.decodeResource(context.getResources(), R.drawable.loading));
bmpManager.loadBitmap(url, imageView);
- android中图片异步加载工具类 ---利用双缓存技术和线程池
- Android实现ListView异步加载图片+缓存+线程池管理
- Android 异步加载图片,使用LruCache和SD卡或手机缓存(使用线程池下载图片)
- 异步线程加载图片工具类
- Android listview异步加载图片(线程池,内存缓存,SD卡缓存)优化显示
- Android异步加载网络图片 + 双缓存
- Android线程池异步加载图片,可LIFO,可FIFO加载,四级缓存
- android 图片异步加载(线程池,等待,唤醒;图片缓存在内存)
- 使用Android新式LruCache缓存图片,基于线程池异步加载图片
- android中使用线程池和临时缓存优化网络图片加载
- Android ListView 图片异步加载和图片内存缓存
- Android ListView 图片异步加载和图片内存缓存机制
- Android ListView 图片异步加载和图片内存缓存
- Android ListView 图片异步加载和图片内存缓存
- Android ListView 图片异步加载和图片内存缓存
- Android ListView 图片异步加载和图片内存缓存
- android异步图片加载三之handler+线程池+消息队列模式+缓存
- Android 异步加载图片+线程池+缓存(详细介绍,深入了解)
- EBP
- Sublime Text 2 tips for Python and web developers
- hbase中filter查询例子
- 内容共享 之 发送内容到其他的APP
- 智能算法浅介----模拟退火,遗传算法,禁忌搜索,神经网络等
- android中图片异步加载工具类 ---利用双缓存技术和线程池
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eproductServ
- hbase条件查询
- Dijkstra_And_Ford
- 字节对齐方式引起的血案
- AT91SAM9X5-EK开发板从NFS启动
- 使用Aspose.Pdf从PDF文件中获取个别的附件
- c++实现使用内存映射文件处理大文件
- STL面试题