Android非同步訊息處理機制(1)Handler基本使用

來源:互聯網
上載者:User

標籤:非同步訊息   android   

Android UI是線程不安全的,如果在子線程中嘗試進行UI操作,程式就有可能會崩潰。解決的方案應該是建立一個Message對象,然後藉助Handler發送出去,之後在Handler的handleMessage()方法中獲得剛才發送的Message對象,然後在這裡進行UI操作就不會再出現崩潰了。
這種處理方式被稱為非同步訊息處理線程。簡單的說就是在子線程中實現更新UI操作。

Handler基本使用

關於Handler的使用包括兩種:

  • 從子線程(worker線程)中向主線程(UI線程)發送訊息,在主線程中處理訊息;
  • 從主線程(UI線程)中向子線程(worker線程)發送訊息,在子線程中處理訊息。
子線程向主線程發送訊息

主要步驟如下:

  1. 在主線程自訂Handler(非抽象類別)子類並實現handleMessage(Message)方法;
  2. 在worker Thread當中通過Handler對象的sendMessage(Message)方法發送Message;
  3. Handler對象將Message放在訊息佇列MessagQueue中;
  4. Looper將Message從訊息佇列中取出,並找到對應的Handler對象。
  5. 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基本使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.