Одно сообщение за раз, за каждый поток и за обработчик.
- Каждый новый экземпляр Handler (...) привязан, явно или неявно, к экземпляру Looper и только один раз.
- Экземпляр Looper, уже где-то создан с помощью вызова Looper.prepare ()
// обычно получается Activity.getMainLooper () или Looper.myLooper ()
- Looper.prepare () использует переменную ThreadLocal sThreadLocal (статическое поле), чтобы иметь один экземпляр Looper на поток.
(Он работает так же, как hashMap.put (Thread.getCurrent (), новый Looper ()))
- каждый петлитель имеет свое личное сообщениеQueue
каждый экземпляр Looper имеет свой основной метод loop ()
loop(){
while(true){
Message msg = messageQueue.next();
msg.target.dispatchMessage(msg);
}
}
для каждого сообщения установлена цель (обработчик), и генерируется исключение (в MessageQueue.enqueueMessage ()), если это не так.
- , поскольку Handler не может быть привязан к нескольким Loopers, он делает так, что каждый обработчик получает только одно сообщение за раз и только с msg.target == handler
поэтому sendMessage () или postMessage () работает примерно так:
handler.post(Message msg){
Looper.sThreadLocal.get(Thread.getCurrent()).messageQueue.push(msg);
}
так что стек вызовов, пока обрабатывает сообщение, должен выглядеть примерно так:
Looper.myLooper()-> Thread.getCurrent()-> Looper-> MessageQueue.next()-> Message-> Message.target-> Handler-> dispatchMessage()-> handleMessage()