关于消息机制四个组成部分的总结性问题

1. Handler和Looper什么时候建立联系:

构造方法:
1. 首先Handler中持有一个Looper对象的引用 2. Looper.myLooper()方法会返回一个Looper对象的应用 3. 将Handler中的Looper对象的引用和Looper.myLooper()方法返回的Looper对象应用等值,即两个引用指向同一个对象

2. Handler和MessageQueue什么时候建立联系:

构造方法:1. 首先Handler中持有一个MessageQueue对象的引用
          2. Looper类中有一个包访问级别的成员:可以通过Looper.mQueue访问
          3. 引用赋值,在构造方法中

3. Message和Handler什么时候建立关联:

1. Handler的实例方法sendMessage() -> sendMessageDelayed() -> sendMessageAtTime() -> enqueueMessage()
2. enqueueMessage()方法中:msg.target = this;  (msg就是sendMessage()方法参数)
3. Message中有一个Handler类型的引用作为成员,此成员是包访问级别的  (此Handler类型的成员的作用:
    在处理消息时能够找到其对应的Handler,即调用哪个Handler对象的dispatchMessage()方法,进而调用handleMessage()
    方法,在handleMessage()方法中有我们处理消息的逻辑)

4. Message和MessageQueue什么时候建立关联(或者说Messag何时插入到MessageQueue中):

1. 同上面的3, 在enqueueMessage()方法中,queue.enqueueMessage(msg, uptimeMillis),流程跳转到MessageQueue的
        enqueueMessage()方法的分析中
2. 在MessageQueue的enqueueMessage()方法中,将Message对象插入到MessageQueue中维护的一个Message类型的单链表中
3. 综上所述,Handler中的实例方法sendMessage()方法最终会调用MessageQueue的enqueueMessage()方法,将消息插入到消息队列中

5. loop()

1. 取消息:-> MessageQueue的实例方法 next() (might block)
2. msg.target.dispatchMessage(msg);即会调用消息所对应的Handler的dispatchMessage()方法
3. 查看Handler的dispatchMessage()方法  ->     handleMessage(msg);

6. Looper对象是什么时候创建的:(前面介绍过Looper.myLooper()会返回一个Looper类型的引用,但是引用的这个对象到底是在什么创建的?):通过Looper类提供的静态方法prepare来创建Looper对象,因为Looper的构造器私有,在静态方法prepare会new出一个自己的对象。

6.1 在ActivityThread中,即主线程中,可以查看ActivityThread.java源文件,找到久违的main方法,在这里调用了Looper.
   prepare()方法,即此时主线程就有对应的Looper对象了
6.2 如果是在自己创建的子线程中,默认是没有Looper,此时需要我们手动创建Looper对象,即调用Looper.prepare()方法。

7. Handler对象是谁创建的?我们自己new出来的.

8. Message对象是谁创建的?我们自己在需要发送消息时,可以手动new出一个Message对象,但是官方是如此建议的:

the best way to get one of these is to call Message.obtain() or one of the Handler.obtainMessage() methods,
which will pull them from a pool of recycled objects.

9. MessageQueue对象是谁创建的?是在创建Looper对象时,在其构造方法中创建的。即Looper对象和MessageQueue对象是成对出现的

10. 为什么说“When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it”?即(Handler对象是在哪里和创建它的线程建立关联的)?

哪里:在Handler的构造方法中,将它里面持有的Looper类型的引用指向了当前Looper对象,而Looper对象的作用域线程级别,
它是和我们的线程关联的(再深层次,Looper对象是通过ThreadLocal维护与线程的关系的)

你可能感兴趣的:(Android,消息机制,android)