首先,这三个的关系还得再加上一个,那就是线程。Handler在创建的时候,会传入一个Looper的对象,默认不传的话,就是主线程中创建的Looper(为什么主Looper不需要调用Looper.prepare() 呢,因为在创建Activity或者Fragment的时候,安卓环境帮我们主动做了处理,所以不需要手动写)。传入的Looper用于遍历MessageQueue获取Message。如果是在子线程中创建Hander(例如:HandlerThread),就需要三步完成Hander的创建。
第一步:执行Looper.prepare(),他的作用是创建一个Looper对象,放到当前线程的ThreadLocal中,一个线程对应一个Looper对象。
第二步:创建一个Hander,创建的时候,把上一步创建的Looper对象传进去,获取创建的Looper对象的方法是Looper.myLooper()。
第三步:执行Looper.loop()方法,他的作用是让Looper遍历MessageQueue,从中取出Message,获取到Message,也就获取到了Hander,因为Message的target就是发送它的Handler,也就是上面创建的Handler。获取到Handler,执行hander对象的dispageMessage方法,这个方法会调用Hander的handleMessage方法,至此,就找到了我们创建Hander需要重写的方法。
关联类介绍:
HandlerThread:
主要用户两个子线程之间的通信。
使用方法:
1、创建一个HandlerThread对象,执行start方法,既启动一个子线程。
2、常见一个Handler,传入的Looper是通过HandlerThread对象获取得到的。
3、在子线程中发送消息,第二步中的Handler就会收到消息。
IntentService的介绍:
之所以说IntentService中的HandlerThread,是IntentService的工作线程,是因为IntentService中的Handler创建的时候,传入的是HandlerThread内部的Handler。 这样启动IntentService的时候,执行onStartCommand方法,onStartCommand会调用onStart方法,这时候就把Intent当作数据传让Handler发出去了。然后就是遍历MessageQueue。