什么是Handler
Handler:处理多进程之间的通信,比如,threadB需要调用ThreadA中的代码(如一些耗时的操作,需要在新的界面进行更新),则需要通过Handler进行
handler角色的作用
Message对象放入到了消息队列MessageQueue
调用了Hanlder的dispatchMessage方法,在该方法中我们完成对Message的处理
1.将消息加入到消息队列中
使用handler. sendMessage将Message对象发送到消息队列中
msg = Message.obtain(uihandler);
uihandler.sendMessage(msg);
使用post方法将消息对象发送到MessageQueue中
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable thread id " + Thread.currentThread().getId());
MainActivity.this.statusTextView.setText("文件下载完成");
}
};
uiHandler.post(runnable);
2.处理消息队列中的消息
Hanlder的dispatchMessage方法,在该方法中我们完成对Message的处理
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
private static void handleCallback(Message message) {
message.callback.run();
}
MessageQueue
消息队列用来存放消息的,其中有两个重要的方法,enqueueMessage和next方法
1.enqueueMessage
将消息发送到消息队列中,同时又两种方法
- sendMessage
- post(runnable r)
以上两种方法中,通过源码层层调用其实际就是enqueueMessage方法
2.next
从消息队列中取出消息
实例
流程如下
1.SendMessage方法发送消息
通过此方法发送消息,需要重写handlMessage方法,如下:
private Handler uihandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//如果使用的是
Log.i(TAG,"msg.what= "+msg.what);
switch (msg.what){
case 1:
System.out.println("handleMessage thread id " + Thread.currentThread().getId());
System.out.println("msg.arg1:" + msg.arg1);
System.out.println("msg.arg2:" + msg.arg2);
MainActivity.this.statusTextView.setText("文件下载完成");
Log.i(TAG,"##文件下载完成,更新UI ");
break;
}
System.out.println("handleMessage thread id " + Thread.currentThread().getId());
MainActivity.this.statusTextView.setText("文件下载完成");
Log.i(TAG,"文件下载完成,更新UI ");
}
};
1.1 通过使用obtainMessage方法实例化msg
Message msg = new Message();//msg对象表示线程要处理的事情
//方式一:使用obtainMessage方法实例化msg,handleMessage中使用msg.what进行匹配
msg = uihandler.obtainMessage();
msg.what = 1;
msg.arg1 = 123456;
msg.arg2 = 654321;
uihandler.sendMessage(msg);
1.2 通过obtain方法实例化msg
msg = Message.obtain(uihandler);
uihandler.sendMessage(msg);
Log.i(TAG,"sendMessage ");
2.post方法发送消息
private Handler uiHandler = new Handler();
2.1 实现Runable接口
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable thread id " + Thread.currentThread().getId());
MainActivity.this.statusTextView.setText("文件下载完成");
}
};
uiHandler.post(runnable);//将Runnable对象通过post方法发送到Handler关联的消息队列中,Handler会在合适的时候将让主线程执行Runnable中的代码,从而更新ui