Looper與Handler是如何通過Message發生關係的

來源:互聯網
上載者:User

經常看到Android的訊息用法大概為:Looper.prepare()Looper.myLooper();xxxHandler = new Handler() {     handleMessage(Message msg){...} };  Looper.loop();  剛開始搞不清楚狀況, 根據名字完全看不出有什麼關係的兩個類,到底如何進行訊息傳遞呢? 只是知道就這麼用就沒問題的, 應該不少人跟我一樣吧.  如然有興趣來解刨一下吧.Looper.prepare();  裡面有一句  sThreadLocal.set(new Looper()); 這裡就new 了一個Looper了, 然後放到ThreadLocal裡面, 這是個線程資料共用的一個類.     private Looper() {        mQueue = new MessageQueue();           mRun = true;        mThread = Thread.currentThread();    }在這裡面就傳遞了當前的背景工作執行緒的資訊,並且new了一個message queue,就是訊息佇列嘛, 用來接收訊息的容器.      public static Looper myLooper() {        return sThreadLocal.get();    } 這個函數就返回了上面建立的那個new Looper();  public Handler() { ...mLooper = Looper.myLooper();mQueue = mLooper.mQueue;...}在這裡就把當前線程的Looper賦給Handler了, 這就發生關係了.  可能有同學還會有疑問, 上面是兩個類的不同的語句Looper.myLooper();怎麼得到的是同一個呢?那就分析一下吧;在Looper類裡面有個全域的靜態容器static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();再進入ThreadLocal類裡面看    public void set(T value) {        Thread currentThread = Thread.currentThread();        Values values = values(currentThread);        if (values == null) {            values = initializeValues(currentThread);        }        values.put(this, value);    }在這裡就把當前的線程的相關資訊設進去了.看看get()函數;    public T get() {        // Optimized for the fast path.        Thread currentThread = Thread.currentThread();         Values values = values(currentThread);        if (values != null) {            Object[] table = values.table;             int index = hash & values.mask;            if (this.reference == table[index]) {                return (T) table[index + 1];                                                                                                               }        } else {            values = initializeValues(currentThread);                                                                                                  }          return (T) values.getAfterMiss(this);                                                                                                      } 再這裡就返回了當前線程的相關資訊.   因為ThreadLocal是個模板容器, 聲明為ThreadLocal<T>在Looper中聲明為ThreadLocal<Looper> , 所以 T == Looper .  簡單的翻譯一下上面的get()和set()吧;public void set(Looper value) {values.put(this, value);}  public void Looper get() {return values.get(this);}  這樣就很清晰了, 關係就是這麼發生的. 回頭梳理一下吧. Looper.prepare()   Looper.myLooper();xxxHandler = new Handler(){  handleMessage(Message msg){...} };  Looper.loop();等價於Looper.prepare() {  sThreadLocal.set(currentThread, new  Looper(); }Looper.myLooper() { sThreadLocal.get(currentThread) }new Handle(){  ...mLooper = sThreadLocal.get(currentThread); mQueue = mLooper.mQueue;...}  關係發生了,這時候就可以通過Message進行通訊了, 這就不多說了. 

相關文章

聯繫我們

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