关键字:缓存池,加载队列
/**
* Title:图片异步加载类
* Description:
* Copyright:Copyright(c) 2012
* Company:
*
* @author tom_liang
*/
package com.zouba.dd.ui.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.lang.ref.SoftReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class DandanAsynchImageLoader {
public static boolean isStop = false; //是否停止异步加载图片线程
private static Object locker = new Object(); //同步锁
private static Thread loadThread = null; //异步加载线程对象
private static Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>(); //所有图片缓存
private static List<AsynchImage> taskQueue = new ArrayList<AsynchImage>(); //异步加载任务的队列
//消息处理器
private static final Handler handler = new Handler() {
public void handleMessage(Message message) {
//当前任务加载到图片后,执行回调
Bundle bundle = message.getData();
AsynchImage asynchImage = (AsynchImage)bundle.getSerializable("handled_task");
asynchImage.getCallback().imageLoaded((Drawable) message.obj,asynchImage.getImgURL());
}
};
static {
DandanAsynchImageLoader.loadThread = new Thread() {
public void run() {
while (!DandanAsynchImageLoader.isStop) {
synchronized (locker) {
if (taskQueue.size() == 0) {
try {
locker.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
AsynchImage temptask = taskQueue.remove(0);
Drawable drawable = loadImageFromUrl(temptask.getImgURL());
imageCache.put(temptask.getImgURL(),new SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0,drawable);
Bundle bundle = new Bundle();
bundle.putSerializable("handled_task", temptask);
message.setData(bundle);
handler.sendMessage(message);
locker.notifyAll();
}
}
}
};
//启动异步线程(网络事件线程)
DandanAsynchImageLoader.loadThread.start();
}
/**
* 异步加载图片的静态方法,首先检查缓存里面是否有之前加载好的图片
* 有的话直接返回;没有,加入到异步任务队列进行加载
* @param imageUrl 网络替片的URL
* @param imageCallback 回调接口
* @return 返回异步图片的Drawable对象
*/
public static Drawable loadDrawable(final String imageUrl,final ImageCallback imageCallback) {
if (imageCache.containsKey(imageUrl)) {
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
Drawable drawable = softReference.get();
if (drawable != null) {
return drawable;
}
}
new Thread(){
public void run(){
synchronized (locker) {
if( !taskQueue.contains(imageUrl) ){
taskQueue.add(new AsynchImage(imageUrl, imageCallback));
}
locker.notifyAll();
}
}
}.start();
return null;
}
/**
* 网络图片加载的回调接口
* @author zouba
*
*/
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable, String imageUrl);
}
/**
* 描述:真实的网络图片加载方法
* @param url 网络图片的地址
* @return 返回网络图片的Drawable对象
*/
private static Drawable loadImageFromUrl(String url) {
URL m;
InputStream i = null;
try {
m = new URL(url);
i = (InputStream) m.getContent();
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Drawable d = Drawable.createFromStream(i, "src");
return d;
}
/*************************************************************************************
* 异步加载图片的Java Bean,对异步图片信息的简单封装
*************************************************************************************/
static class AsynchImage implements Serializable{
private static final long serialVersionUID = 1L;
private String imgURL;
private ImageCallback callback;
public AsynchImage(String imgURL, ImageCallback callback) {
this.imgURL = imgURL;
this.callback = callback;
}
public String getImgURL() {
return imgURL;
}
public void setImgURL(String imgURL) {
this.imgURL = imgURL;
}
public ImageCallback getCallback() {
return callback;
}
public void setCallback(ImageCallback callback) {
this.callback = callback;
}
}
}