首先,HandelThread也是一个Thread
其次,HandelThread与handel密切相关,我们知道,handel与创建它的线程的looper相关联
而HandelThread与Thread的最大区别就是它提供了一个looper,让我们循环处理队列中的各种消息
而一般来说,我们创建的activity都是自带looper,这也是我们能在主线程中使用handler的原因
我们可以通过Handler handler = new Handler(myHandelThread.getLooper());来设置与handler相关联的looper
这里使用的就是HandelThread所带的looper
下面是一个用于处理下载列表图片工具类例子
public class ThumbnailDownloader<Token> extends HandlerThread{
private static final int MESSAGE_DOWNLOAD = 0;
private static final String TAG = "HandlerThread";
private Handler mHandler;
private Handler mResponHandler;
private Listener<Token> mListener;
private Map<Token,String> requestMap = Collections.synchronizedMap(new HashMap<Token, String>());
/**
* 构造方法,传入主线程的handler
* @param responseHandler
*/
public ThumbnailDownloader(Handler responseHandler) {
super(TAG);
mResponHandler = responseHandler;
}
/**
* 在启动looper前回调
*/
@Override
protected void onLooperPrepared() {
// TODO Auto-generated method stub
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if(msg.what == MESSAGE_DOWNLOAD){
//启动下载
@SuppressWarnings("unchecked")
Token token = (Token)msg.obj;
handlerRequest(token);
}
}
};
}
/*
* 外部调用方法,将下载任务添加到队列中
*/
public void queueThumbnail(Token token , String url){
Log.e(TAG, url);
requestMap.put(token, url);
mHandler
.obtainMessage(MESSAGE_DOWNLOAD,token)
.sendToTarget();
}
/**
* 启动下载
* @param token
*/
private void handlerRequest(final Token token){
try {
final String url = requestMap.get(token);
if(url == null) return ;
//这里获取图片,假设是bitmap
//将图片返回到UI线程
mResponHandler.post(new Runnable() {
@Override
public void run() {
if(requestMap.get(token) != url){
return ;
}
requestMap.remove(token);
//回调,通知主线程
//mListener.onThumbnailDownloaded(token, bitmap);
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 回调接口,通知UI线程图片处理完成
* @author Administrator
*
* @param <Token>
*/
public interface Listener<Token>{
void onThumbnailDownloaded(Token token ,Bitmap bitmap);
}
/**
* 设置监听
* @param listener
*/
public void setListener(Listener<Token> listener){
mListener = listener;
}
}