標籤:非同步訊息 android
Android UI是線程不安全的,如果在子線程中嘗試進行UI操作,程式就有可能會崩潰。解決的方案應該是建立一個Message對象,然後藉助Handler發送出去,之後在Handler的handleMessage()方法中獲得剛才發送的Message對象,然後在這裡進行UI操作就不會再出現崩潰了。
這種處理方式被稱為非同步訊息處理線程。簡單的說就是在子線程中實現更新UI操作。
Handler基本使用
關於Handler的使用包括兩種:
- 從子線程(worker線程)中向主線程(UI線程)發送訊息,在主線程中處理訊息;
- 從主線程(UI線程)中向子線程(worker線程)發送訊息,在子線程中處理訊息。
子線程向主線程發送訊息
主要步驟如下:
- 在主線程自訂Handler(非抽象類別)子類並實現
handleMessage(Message)方法;
- 在worker Thread當中通過Handler對象的
sendMessage(Message)方法發送Message;
- Handler對象將Message放在訊息佇列MessagQueue中;
- Looper將Message從訊息佇列中取出,並找到對應的Handler對象。
- Looper調用Handler對象的
handleMessage(Message)方法處理Message。
其中,我們只要完成1,2兩步,其餘由系統完成。
主要代碼如下:
//在main Thread中建立Handler對象handler = new MyHandler();//建立worker Threadnew Thread(new Runnable() { @Override public void run() { //建立訊息對象 Message message = handler.obtainMessage(); message.obj = "我是從worker Thread向main Thread發送的訊息"; //發送訊息對象 handler.sendMessage(message); }}).start();
其中,MyHandler類如下:
class MyHandler extends Handler { @Override public void handleMessage(Message msg) { Log.d("result:",Thread.currentThread().getName()); //只有在main Thread中才能操作UI Log.d("result",(String)msg.obj); }}
上述方法就實現了從子線程(worker線程)中向主線程(UI線程)發送訊息,在主線程中處理訊息。
主線程向子線程發送訊息
主要步驟如下:
1. 準備Looper對象2. 在 worker Thread產生Handler對象並實現`handleMessage()`方法;3. 在MainThread當中通過Handler對象的`sendMessage(Message)`方法發送Message。
一般在子線程中的實現代碼如下:
new Thread(){ @Override public void run() { //準備Looper對象 Looper.prepare(); handler2 = new MyHandler(); //迴圈檢查訊息佇列,然後調用handleMessage()方法處理,若沒有訊息對象則該線程阻塞。 Looper.loop(); }}.start();
這裡仍然使用了上面的MyHandler類。然後直接在主線程中調用handler2的sendMessage(Message)方法就能向子線程中發送訊息,並在子線程中處理訊息了。代碼如下:
Message message = handler2.obtainMessage();message.obj = "我是從main Thread向worker Thread 發送的訊息";handler2.sendMessage(message);
上述方法就實現了從主線程(UI線程)中向子線程(worker線程)發送訊息,在主線程中處理訊息。
也就是在哪裡建立Handler對象,就在哪裡處理該對象。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android非同步訊息處理機制(1)Handler基本使用