1. 程式人生 > >Android的訊息處理:Looper,Handler和Message

Android的訊息處理:Looper,Handler和Message

Handler例項: 子類需要繼承Hendler類,如果是處理Message資料,並必須要重寫handleMessage(Message msg)方法。 以下為一個例項,它實現的功能為:通過執行緒修改介面Button的內容
public class MyHandlerActivity extends Activity {
    Button button;
    MyHandler myHandler;
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handlertest);
 
        button = (Button) findViewById(R。id。button);     
	//無引數的建構函式,預設用了本執行緒的looper,所以如果是在非ooper執行緒裡要先prepare()把當前執行緒變為looper執行緒,讓咱通過loop()方法啟動迴圈
	myHandler = new MyHandler();//如果在子執行緒中要生成主執行緒的可以寫new Handler(Looper.getMainLooper())
        //當建立一個新的Handler例項時, 它會繫結到當前執行緒和訊息的佇列中,開始分發資料
        //Handler有兩個作用, (1) : 定時執行Message和Runnalbe 物件 (2): 讓一個動作,在不同的執行緒中執行。
 
        //myHandler.post(Runnable)
        //myHandler.postAtTime(Runnable,long)
        //myHandler.postDelayed(Runnable,long)
        //以上方法以post開頭的允許你處理Runnable物件,把Runnable物件排入MessageQueue

        //myHandler.sendEmptyMessage(int)
        //myHandler.sendMessage(Message);
        //myHandler.sendMessageAtTime(Message,long)
        //myHandler.sendMessageDelayed(Message,long)
        //myHandler.sendMessage()//允許你處理Message物件(Message裡可以包含資料),需要重寫handleMessage(Message msg)方法
 
        MyThread m = new MyThread();
        new Thread(m).start();
    }
 
    /**
    * 接受訊息,處理訊息 ,此Handler會與當前主執行緒一塊執行
    * */
    class MyHandler extends Handler {
        public MyHandler() {
        }
        public MyHandler(Looper L) {
            super(L);
        }
        //子類必須重寫此方法,接受資料
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            Log.d("MyHandler", "handleMessage。。。。。。");
            super.handleMessage(msg);
            // 此處可以更新UI
            Bundle b = msg.getData();
            String color = b.getString("color");
            MyHandlerActivity.this.button.append(color);
        }
    }
    class MyThread implements Runnable {
        public void run() {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Log.d("thread......", "mThread.....");
            Message msg = new Message();
            Bundle b = new Bundle();// 存放資料
            b.putString("color", "我的");
            msg.setData(b);
 
            MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler傳送訊息,更新UI
        }
    }
}