Handler類:
1 在子線程中發送Message
2 在主線程中獲取、處理Message異步
在新線程中 經過Handler機制通知UI線程改變界面。ide
每一個線程只能擁有一個Looper,而每一個Looper關聯一個MessageQueueoop
UI線程中,系統默認初始化了一個Looper對象。post
Looper、MessageQueue、Handler的做用以下:
1 Looper: 每一個線程只有一個Looper,它負責管理MessageQueue;經過Looper.loop()方法會不斷從MssageQueue中取出Message且經過msg.target.dispatchMessage(msg)分發Message給對應的Handler;
2 MessageQueue:由Looper負責管理,它經過隊列的先進先出來管理Message。
3 Handler: 它能把Message發給MessageQueue,並負責處理Looper分發給他的對應的Message。spa
Message是經過Handler對象發給MessageQueue的,而MessageQueue是由Looper負責建立的。
因此在線程中使用Handler分3步:
1 Looper.prepare()
2 重寫Handler的handleMessage(Message msg)建立Handler子類對象
3 Looper.loop()線程
如何在新線程中建立Looper對象呢
private class CalThread extends Thread {
public Handler handler;
public void run() {
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// handler接收、處理Message
}
}
Looper.loop();
}
}對象
mCalThread = new CalThread().start();隊列
Message msg = new Message();
msg.what = 0x123;
Bundle data = new Bundle();
data.putInt(EXTRA_DATA, 11111);
msg.setData(data);事件
// 主線程向子線程發送Message,在子線程中接收、處理Message (耗時操做在子線程中處理)
mCalThread.handler.sendMessage(msg);get
// 子線程向主線程發送Message,在主線程中接收、處理Message(通常用來修改UI)
UI線程主要負責處理用戶的按鍵事件、用戶觸屏事件及屏幕繪圖事件。
新線程中更新UI的幾種操做:
1 使用Handler實現線程之間的通訊
2 Activity.runOnUiThread(Runable)
3 View.post(Runable)
4 View.postDelayed(Runable, long)
AsyncTask是爲了簡化二、三、4的操做,適用於簡單的異步處理。
AsyncTask<Params, Progress, Result>
使用AsyncTask注意事項:
1 必須在UI線程中建立AsyncTask的實例
2 必須在UI線程中調用AysncTask的execute()
3 AsysncTask各類回調方法不能手動調用,只能由系統調用
4 每一個AsyncTask只能執行一次。
Handler和IntentService的配合使用