解答爲什麼谷歌大哥設計Looper一個線程中只能有一個

其實很簡單:
我們來看Looper.loop()方法裏面的代碼:
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException(“No Looper; Looper.prepare() wasn’t called on this thread.”);
}
final MessageQueue queue = me.mQueue;
…省略部分代碼
//這裏是個無限循環,主要做的事情就是取出消息隊列裏面的消息。 所以說當線程代碼執行到這裏的時候,線程已經被卡在這裏了。就不可能再創建出其他的Looper運行在這個線程中了。所以說爲什麼設計成一個線程只有一個Looper了。
for (;;) {
Message msg = queue.next(); // might block
…省略部分代碼
msg.target.dispatchMessage(msg);
//這段代碼就是取出了消息然後做分發。msg.target這裏去到的是一個Handler實例。然後這個實例對象再去調用dispatchMessage(msg);就回調到了我們使用handler重寫的dispatchMessage(Message msg)中了 示例代碼:
// Handler h = new Handler(){
// @Override
// public void dispatchMessage(Message msg) {
// 所以我們可以在這裏處理收到的消息。
// }
// };
}

總結:
一個線程中設計成只有一個Looper是因爲Loop裏面有一個無限循環。 Looper的作用就是循環取出消息隊列的消息然後再分發出去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章