android消息机制
android消息机制按语言分层主要包含:
1.JAVA:Thread, ThreadLocal, Looper,MessageQueue, Message,Handler
2.Native:NativeMessageQueue.cpp
3.C++:Looper.cpp, Looper.h(MessageEnvelope,Message,MessageHandler)
以android7.1为例,代码路径:
\LINUX\android\libcore\ojluni\src\main\java\java\lang\ThreadLocal.java
\LINUX\android\libcore\ojluni\src\main\java\java\lang\Thread.java
\LINUX\android\frameworks\base\core\java\android\os
\LINUX\android\frameworks\base\core\jni\android_os_MessageQueue.cpp
\LINUX\android\system\core\include\utils\Looper.h
\LINUX\android\system\core\libutils\Looper.cpp
上述对象的关系图如下:
一般创建消息循环队列的流程:
{
Looper.prepare();
//可创建Handler
Looper.loop();
}
上面两个函数的具体作用如图:
prepare():在当前线程创建了Looper对象,在Looper对象里创建了MessageQueue
每个线程只能有一个MessageQueue,所以prepare()最多只能调用一次。
loop(): 该方法进入死循环,从MessageQueue取出下一个消息,然后循环处理
Handler分析:
功能:
1.往MessageQueue插入消息或者删除Message
2.处理Message
创建:
无Looper构造:使用当前线程的Looper,若是当前线程之前未调用prepare()则报错,因为当前线程还没有创建绑定Looper。
有Looper构造:指定Looper对象,可参考HandlerThreadgetLooper.getLooper()
问题:
1. Thread和Looper如何通过ThreadLocal绑定
2. Handler如何和Looper绑定
3. 构造新Message为什么使用Message.obtain()而不是new Message()
4. MessageQueue中的IdleHandler是什么
5. MessageQueue中没有该处理的消息,对应线程阻塞后是如何唤醒的
6. Looper.cpp中的addFd方法的功能