先举个子线程中使用Handler的例子:
package com.haoran.myhandler;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
Looper looper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(){
@Override
public void run() {
System.out.println("子线程中打印线程名:"+Thread.currentThread().getName());
Looper.prepare();
looper = Looper.myLooper();
looper.loop();
}
}.start();
Handler handler = new Handler(looper){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
System.out.println("主线程中打印线程名:"+Thread.currentThread().getName());
}
};
Message message = Message.obtain();
handler.sendMessage(message);
}
}
大家看了这段代码估计会有疑惑,子线程中怎么没有new Looper()? Handler(looper)的构造做了什么操作?
那好,我们debug运行下
其实
从 FrameWork层 MainActivity.class –> Activity.class –> ActivityThread.class –> ActivityThread.class中的内部类(H.class) 和main方法。
Handler消息机制起了很大的作用,从四大组件的启动,模板模式进行生命周期方法的回调,都是消息机制在默默的进行着。从源码层看,安卓主线程在创建过程中,在ActivityManager的main入口,通过自动初始化了一个Looper和Handler以及handleMessage方法进行消息机制 再通过H.class中进行四大组件的消息机制的判断
消息类型定义:
消息处理方法:
我们说了半天的Handler消息机制的重要性好像和Handler消息机制原理没有半毛钱关系,最开始代码引发我们思考的问题依然无法回答。
下面我们从Handler消息机制的UML图,及相关类源码进一步进行分析,先上图:
这张架构图我们可以花时间分型一下,分析他们之间互相持有的关系。哈哈,这里我就简单概述一下,再走一下源码。。。
首先
作为一个合格的助手,Handler里有mQueue和mLooper对象;于是就有了消息队列MessageQueue和轮询器Looper,再将消息Message放在消息队列里面。Message记录着相对应的Handler,MessageQueue里持有Message对象,Looper通过持有的MessageQueue对象,对消息进行轮询读写
图解: