共同点
都是用于多个线程间通信,通知其他线程某些任务已经处理完成。
区别
Handler主要是子线程通知Android的UI线程(主线程)更新界面。
HandlerThread主要是Android的UI线程(主线程)通知子线程中的handler去做异步任务。
示例场景
- Handler的使用场景
网络请求完成后,通知UI线程刷新界面。
public class Main3Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
new Thread(new Runnable() {
@Override
public void run() {
//网络请求中......
SystemClock.sleep(5000);
//网络操作完成,给主线程的handler发消息
handler.sendEmptyMessage(32);
}
}).start();
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 32) {
Log.i("success", "接收到消息");
//在这里处理ui刷新
}
}
};
}
- HandlerThread的使用场景
主线程通知子线程做异步任务
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
btnSendMsg = (Button) findViewById(R.id.btn_send_messege);
btnSendMsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击一次就给子线程中的handler发消息
handler.sendEmptyMessage(322);
}
});
HandlerThread thread = new HandlerThread("backThread");
thread.start();
handler = new BackHandler(thread.getLooper());
}
/**
* 这个handler是在子线程中创建的
*/
private class BackHandler extends Handler {
public BackHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
Log.i("msg", "当前线程是" + Thread.currentThread().getName() + "...接收到了主线程的消息");
}
}