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


    上述对象的关系图如下:

android消息机制

一般创建消息循环队列的流程:

{

Looper.prepare();

//可创建Handler

Looper.loop();

}

上面两个函数的具体作用如图:

android消息机制

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方法的功能