關於Android Handler如何完成線程切換


  網站講Handler源碼解析的文章有很多,這里就不重復造輪子了,直接切重點。

  其實子線程用Handler通過sendMessage發送消息,切換到主線程handleMessage進行處理,完成線程切換沒有什么神奇的。

  首先自己也可以實現一個線程切換,聲明一個全局的類,在主線程對這個類進行實例化,子線程可以通過這個類的引用來執行這個類里面的方法,這就是線程切換。Handler也是如此不過容易被大家忽略。

public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
        ........return enqueueMessage(queue, msg, uptimeMillis);
    }

 

  Handler發送消息最終會走到enqueueMessage方法

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
        msg.target = this;
        ........return queue.enqueueMessage(msg, uptimeMillis);
    }

 

  msg.target = this,這句話讓target變量指向當前發送消息的Handler,即在主線程實例化的Handler。

 public static void loop() {
        ........
        for (;;) {
        ........
           msg.target.dispatchMessage(msg);
        ........
            }
        ........
}        

  在Looper.loop()里面,通過這個Handler引用調用到Handler的dispatchMessage(Message msg)

public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);//Handler Post了一個runnable
        } else {
            if (mCallback != null) { //判斷是否實現了callback
                if (mCallback.handleMessage(msg)) { 
                    return;
                }
            }
            handleMessage(msg);//主線程方法
        }
    }

  dispatchMessage()最終走到了主線程的handleMessage方法。是不是很簡單。

  

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM