AsynImageLoader andriod异步加载图片类

public class AsynImageLoader {private static final String TAG = "AsynImageLoader";// 缓存下载过的图片的Mapprivate Map<String, SoftReference<Bitmap>> caches;// 任务队列private List<Task> taskQueue;private boolean isRunning = false;private Context context;private ImageTools imageTools;public AsynImageLoader(Context context){this.context = context;this.imageTools= ImageTools.getInstance(this.context);// 初始化变量this.caches = new HashMap<String, SoftReference<Bitmap>>();this.taskQueue = new ArrayList<AsynImageLoader.Task>();// 启动图片下载线程this. isRunning = true;new Thread(runnable).start();}/**** @param imageView 需要延迟加载图片的对象* @param url 图片的URL地址* @param resId 图片加载过程中显示的图片资源*/public void showImageAsyn(ImageView imageView, String url, int resId){imageView.setTag(url);Bitmap bitmap = loadImageAsyn(url, getImageCallback(imageView, resId));if(bitmap == null){imageView.setImageResource(resId);}else{imageView.setImageBitmap(bitmap);}}/**** @param imageView 需要延迟加载图片的对象* @param url 图片的URL地址* @param resId 图片加载过程中显示的图片资源*/public void showBgImageAsyn(View view, String url, int resId){Bitmap bitmap = loadImageAsyn(url, getImageCallback(view, resId));if(bitmap == null){//view.setBackgroundResource(resId);}else{view.setBackgroundDrawable(ImageUtils.bitmapToDrawable(bitmap));}}public Bitmap loadImageAsyn(String path, ImageCallback callback){// 判断缓存中是否已经存在该图片if(caches.containsKey(path)){// 取出软引用SoftReference<Bitmap> rf = caches.get(path);// 通过软引用,获取图片Bitmap bitmap = rf.get();// 如果该图片已经被释放,则将该path对应的键从Map中移除掉if(bitmap == null){caches.remove(path);bitmap=imageTools.readImageFromLocal(path);if (bitmap != null) {caches.put(path, new SoftReference<Bitmap>(bitmap));Log.i(TAG, "return image in local" + path);return bitmap;}}else{// 如果图片未被释放,,直接返回该图片Log.i(TAG, "return image in cache" + path);return bitmap;}}else{Bitmap bitmap = imageTools.readImageFromLocal(path);if (bitmap != null) {caches.put(path, new SoftReference<Bitmap>(bitmap));Log.i(TAG, "return image in local" + path);return bitmap;}// 如果缓存中不常在该图片,则创建图片下载任务Task task = new Task();task.path = path;task.callback = callback;Log.i(TAG, "new Task ," + path);if(!taskQueue.contains(task)){taskQueue.add(task);// 唤醒任务下载队列synchronized (runnable) {runnable.notify();}}}// 缓存中没有图片则返回nullreturn null;}/**** @param imageView* @param resId 图片加载完成前显示的图片资源ID* @return*/private ImageCallback getImageCallback(final ImageView imageView, final int resId){return new ImageCallback() {@Overridepublic void loadImage(String path, Bitmap bitmap) {if(path.equals(imageView.getTag().toString())){imageView.setImageBitmap(bitmap);}else{imageView.setImageResource(resId);}}};}/**** @param 加载背景图片* @param resId 图片加载完成前显示的图片资源ID* @return*/private ImageCallback getImageCallback(final View view, final int resId){return new ImageCallback() {@Overridepublic void loadImage(String path, Bitmap bitmap) {try {try {view.setBackgroundDrawable(ImageUtils.bitmapToDrawable(bitmap));} catch (Exception e) {view.setBackgroundResource(resId);}} catch (Exception e) {MyLogs.e(e);}}};}private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {// 子线程中返回的下载完成的任务Task task = (Task)msg.obj;// 调用callback对象的loadImage方法,并将图片路径和图片回传给adaptertask.callback.loadImage(task.path, task.bitmap);}};private Runnable runnable = new Runnable() {@Overridepublic void run() {while(isRunning){// 当队列中还有未处理的任务时,执行下载任务while(taskQueue.size() > 0){// 获取第一个任务,并将之从任务队列中删除Task task = taskQueue.remove(0);// 将下载的图片添加到缓存task.bitmap =imageTools.ReadImageFromCache(task.path);caches.put(task.path, new SoftReference<Bitmap>(task.bitmap));if(handler != null){// 创建消息对象,并将完成的任务添加到消息对象中Message msg = handler.obtainMessage();msg.obj = task;// 发送消息回主线程handler.sendMessage(msg);}}//如果队列为空,则令线程等待synchronized (this) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}};//回调接口public interface ImageCallback{void loadImage(String path, Bitmap bitmap);}class Task{// 下载任务的下载路径String path;// 下载的图片Bitmap bitmap;// 回调对象ImageCallback callback;@Overridepublic boolean equals(Object o) {Task task = (Task)o;return task.path.equals(path);}} }

相信成功的信念比成功本身更重要,

AsynImageLoader andriod异步加载图片类

相关文章:

你感兴趣的文章:

标签云: