Android訊息機制

來源:互聯網
上載者:User

標籤:adl   get   open   float   one   top   logs   資料   www   

每個Android應用在啟動的時候都會建立一個線程。這個線程被稱為主線程或者UI線程。Android應用的全部操作預設都會執行在這個線程中。
可是當我們想要進行資料請求,圖片下載。或者其它耗時操作時,是不可能在這個UI線程做的。由於Android在3.0以後的版本號碼已經禁止了這件事情,直接拋出一個異常。所以我們須要一個子線程來處理那些除UI操作的事情。
可是這個又會有一個問題。我們僅僅能在UI線程進程UI操作,僅僅能在子線程進行耗時操作。假設我們須要在耗時操作結束後在Android介面上顯示一個View,我們應該怎麼做?我們是不可能在子線程直接重新整理UI的。這時我們須要用到Android的訊息機制。來實現主線程和子線程的通訊。簡單來說,就是子線程擷取到資料之後,不直接進行UI更新,而是把資料裝到訊息中發送到主線程,主線程中有一個迴圈輪詢會馬上收到子線程發過來的資訊,然後拿到訊息資料後在主線程更新UI 。說起來比較簡單。我們來細緻的看一下詳細是怎麼說的。

處理訊息的手段——Handler, Looper, MessageQueueHandler

我們先解說一下Handler,Handler顧名思義就是處理者,通常對他的使用方法是在UI線程中建立一個Handler,並覆寫他的handleMessage, 然後再耗時的線程中將訊息postUI線程。範例例如以下:

class MyHandler extends Handler{    @Override    public void handleMessage(Message msg){    //更新UI    }}MyHandler mHandler = new MyHandler();new Thread(){    public void run(){        mHandler.sendEmptyMessage(123);    };}.start();

這裡規定了Handler必須在主線程建立。由於僅僅有在UI線程建立才會讓Handler關聯到已有的MessageQueue

MessageQueue被封裝到Looper中,而Looper又通過ThreadLocal封裝到一個線程中。最後相當於MessageQueue關聯了一個線程。所以簡單來說就是Handler將訊息投遞到一個關聯了線程的MessageQueue中,然後Handler在從MessageQueue中取出訊息,而且處理它。
我們看一下Handler的2個經常使用的方法

void handleMessage(Message msg) : 處理訊息的方法
final boolean sendMessage(Message msg) : 馬上發送訊息

第一個方法 我們通常在

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.