解答为什么谷歌大哥设计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的作用就是循环取出消息队列的消息然后再分发出去。

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