Handler使用介紹: Handler根據接收的消息,處理UI更新。Thread線程發出消息,通知Handler更新UI。 Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg ...
Handler使用介紹:
Handler根據接收的消息,處理UI更新。Thread線程發出消息,通知Handler更新UI。
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0x1:
view.invalidate();
break;
}
super.handleMessage(msg);
}
};
class UpdateViewThread implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
Message message = new Message();
message.what = 0x1;
mHandler.sendMessage(message);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
(1)對於線程中的刷新一個View為基類的界面,可以使用postInvalidate()方法線上程中來處理,其中還提供了一些重寫方法比如postInvalidate(int left,int top,int right,int bottom) 來刷新一個矩形區域,以及延時執行,比如postInvalidateDelayed(long delayMilliseconds)或postInvalidateDelayed(long delayMilliseconds,int left,int top,int right,int bottom) 方法,其中第一個參數為毫秒
(2)可以在一個線程的run方法中調用Handler對象的postMessage或sendMessage方法來實現,Android程式內部維護著一個消息隊列,會進行輪詢處理。
(3)在Android中每一個Thread都跟著一個Looper,Looper可以幫助Thread維護一個消息隊列,但是Looper和Handler沒有什麼關係,從源碼中可以看到Android提供了一個Thread繼承類HanderThread可以幫助我們處理,在HandlerThread對象中可以通過getLooper方法獲取一個Looper對象控制句柄,我們可以將這個Looper對象映射到一個Handler中來實現一個線程同步機制,Looper對象的執行需要進行初始化,可以調用Looper.prepare,使用Looper.release方法釋放資源。
(4)對於Android中Handler可以傳遞一些內容,通過Bundle對象可以封裝String、Integer以及Blob二進位對象,我們通過線上程中使用Handler對象的sendEmptyMessage或sendMessage方法來傳遞一個Bundle對象到Handler處理器。對於Handler類提供了重寫方法handleMessage(Message msg) 來判斷,通過msg.what來區分每條信息。將Bundle解包來實現Handler類更新UI線程中的內容實現控制項的刷新操作。相關的Handler對象有關消息發送sendXXX相關方法如下,同時還有postXXX相關方法,一個為發送後直接返回,一個為處理後才返回。
(5)在Android中提供了一種有別於線程的處理方式,就是Task以及AsyncTask,從源碼中可以看到是針對Concurrent的封裝,開發人員可以方便的處理這些非同步任務。