什麼是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