6/03/2011

[Android] Handler, Message, MessageQueue

注意 : 深度開發application時,必須必備的基本觀念”Handler, Message, Looper, MessageQueue” 一般來說就是android提供的class,andorid就是一堆的class建構起來的,這四個class有著共同的目標,可以讓程式碼,可以丟到其他的threas()去執行,為什麼要這樣的定義呢?其實android 的 GUI 元件是 thread safe的 (意思是,元件的使用,無法multi-thread執行)=>View無法thread?不是這樣說,應該說Activity 的畫面顯示是由 UI Thread所負責的,若是你寫了 mutlti-thread 程式時又想更新畫面,就必須要將 Thread 內部的一段程式碼,交由 UI Thread 來執行才行,這樣有的好處避免程式傳遞資料不會有錯誤的狀況發生.

Handler ,主要提供 callback function,準備給其他的thread執行,但是每個thread間是透過何方式傳遞訊息給UI thread呢?於是有了Message
Message,將Handler 包裝起來,傳送給其它 Thread,但是同時有多條 thread 不斷的在系統中傳遞 Message 那麼如何緩衝呢 ?
MessageQueue 的目地,是為了讓 Message 能夠作緩衝,好讓Message先暫存起來。因此,當Message 已經被放在其它 Thread上的MessageQueue 之後,
它裡面包著 Handler,而 Handler上的 callback function 總得有人來執行吧 ??
以上觀念大致都懂了之後,來了解程式碼吧~這次要做的是每秒更新UI View畫面,將系統的時間更新至畫面上.
1.首先在程式裡先建立一個MyThread class
image
Android要以thread的觀念去構思,會花比較長時間的運算,建議放至thread去運行,假如thread要更新UI VIEW,必須要透過handler的方式運作,並交由Message 與 Message Queue的方式,要不然程式可以執行,但是不能更新UI VIEW.由下列可知須交由handler.
java.util.Date tNow =  new Date(System.currentTimeMillis());
MyMessageDemoTest.this.m_LblInfo.setText(tNow.toString());
2.handler宣告
private static final int WMU_PUTHINT=100;
private static final int WMU_UPDATECMDUI=101;

image
image
以上在MyThread起來後,透過updateCmdUi();
    m_Handler.sendEmptyMessage(WMU_UPDATECMDUI);
交給handler去傳遞.
image

總之:
若不是Main Thread則無法去變更畫面的Widget內容,需透過android.os.Handler來達到此效果。

沒有留言:

張貼留言

請留言~一起討論吧~