Handler、Looper跟MessageQueue运行的基本过程

Handler、Looper和MessageQueue运行的基本过程

ThreadLocal(线程本地变量)的初步介绍:

Handler、Looper跟MessageQueue运行的基本过程

1、执行ThreadLocal对象的set(Object obj)方法,将会向ThreadLocal存入一个以当前线程对象为键,obj为数据的键值对

2、执行ThreadLocal对象的get()方法,将会根据当前线程对象为键,取出与之对应的值

在WorkerThread使用Looper的三步骤如下

Handler、Looper跟MessageQueue运行的基本过程

通过查看android源代码来分析Handler、Looper、MessageQueue以及Thread之间的关系

首先看下Looper的prepare方法

Handler、Looper跟MessageQueue运行的基本过程

Handler、Looper跟MessageQueue运行的基本过程

通过查看Looper.java可知Looper类的成员变量有mQueue和mThread,Looper类的prepare方法生成Looper对象(同时生成MessageQueue对象和获取当前线程对象),并与当前线程对象凑成键值对存入ThreadLocal的sThreadLocal当中,一个线程中只能有一个Looper

 

再来看看Handler生成对象时的代码

Handler、Looper跟MessageQueue运行的基本过程

Handler、Looper跟MessageQueue运行的基本过程

Handler、Looper跟MessageQueue运行的基本过程

当生成Handler对象时,调用Looper类的myLooper方法获取当前线程对象的looper并赋值给Handler类的mLooper属性,通过mLooper的mQueue属性赋值给Handler类的mQueue属性

 

最后看下Looper的loop方法

Handler、Looper跟MessageQueue运行的基本过程

MessageQueue类的next()方法用于从消息队列中取出Message对象(可查看MessageQueue类的源代码)

Message类对象的target属性是Handler类的对象

Handler、Looper跟MessageQueue运行的基本过程

在通过调用Handler类的obtainMessage方法生成一个Message对象时

Handler、Looper跟MessageQueue运行的基本过程

obtainMessage方法中调用了Message类的obtain方法,this为调用obtainMessage方法的对象,即Handler对象。

Handler、Looper跟MessageQueue运行的基本过程

obtain()方法用于得到Message对象,赋值给m,将h赋值给m的target属性。一个Handler对象对应一个Looper对象,一个Looper对象对应一个MessageQueue对象,使用Handler对象生成Message对象的target属性就是该Handler对象,一个Handler对象可以生成多个Message对象

Handler、Looper跟MessageQueue运行的基本过程

dispatchMessage方法调用handlerMessage方法处理消息