HandlerThread很多人看起来很熟悉,可能没怎么使用过。HandlerThread顾名思义是handler+Thread的结合体。都知道handle是处理异步消息的载体,而Theard是线程。我们都知道在子线程中是无法直接更新UI,需要一个桥梁连接,handler就是这样的一个角色。
1.假设我们现在需要下载一首歌。通过子线程更新下载进度,但是我们要把实时进度展示给用户看。我们可以使用handler+Thread实现如下:
private Handler handler =new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case0://更细下载进度
text.setText("下载" + process + "%");//在主线程中更新
break;
case1:
text.setText("下载完成");//在主线程中更新UI界面
break;
default:
break;
}
}
};
protected void onCreate(Bundle savedInstanceState) {
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
publicvoid run() {
for(inti = 0; i < 100; i++){
try {
Thread.sleep(300);//模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(0);//发送消息到handler}
handler.sendEmptyMessage(1);
}
}.start();
}
});
}
以上是通过handler+Thread实现子线程和主线程通讯。使用这种方式需要重写looper;而HandlerThread完美结合了handler和Thread的功能。
HandlerThread使用:
//1.初始化,参数为名字
myHandlerThread =new HandlerThread("hThread");
//必须调用start方法,为后面的handler提供looper
myHandlerThread .start();
//初始化Handler,只是传递了一个mHandlerThread内部的一个
looperHandler =new Handler(myHandlerThread .getLooper()) {
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
}
}
//使用
public void setThread(View view){
new setThread (mHandler).start();
}
private final class setThread extends Thread{
private Handler tHandler;
setThread(Handler handler) { this.tHandler = handler; }
@Override
public void run() {
super.run();
for(inti =0; i <4; i++){
tHandler.sendEmptyMessage(0x1);
sleep(1000);
}
}
}
总结:
1.如果我们有耗时的任务处理可以通过HandlerThread获取looper,looper进而构造Handler,然后通过Handler的post(Runnable r)在handleMessage里进行处理耗时处理。
2.使用HandlerThread子线程和主线程通信更加方便。
网友评论