[Android笔记]HandelThread使用

首先,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;
}






}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值