Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android異步消息處理機制(1)Handler基本使用

Android異步消息處理機制(1)Handler基本使用

編輯:關於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 Thread
new 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對象,就在哪裡處理該對象。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved