android中Handler、MessageQueue、Looper间关系
先来看一段普通开启子线程处理耗时任务的写法
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
handler.obtainMessage(11);
Looper.loop();
}
}).start();
其中关键的类有Handler,Thread,Runalbe,Looper,在源码的分析过程中还会有一个重要的类MessageQueue
逻辑都是从new Thread开始的一段旅程,Thread就是一个普通的类,实现了Runnable接口,而Runnable也只是一个普通的接口,里面只有一个待实现的run()方法。Thread的构造函数只也都是在调用本类的create(),在create()中add进当前的threadGroup中。threadGroup与thread的关系就是单个与群关系。
然后Looper这个神奇的类。在Looper.prepare()方法首先进行的MessageQueue初始化。而在MessageQueue的构造函数中调用了native方法nativeInit(),即进行了与底层库进行了调用。
接着Handler的内部构造, Handler的职责就是通过sendMessage()方法把message发送到messageQueue。在sendMessage()方法中最终调用的是messageQueue中的enqueueMessage(),而在messageQueue的enqueueMessage()方法中调用的native方法则是将当前消息按时间先后顺序进行排序,(未到时间的message进行等待否则进行排序)
然后就是执行Looper.loop(),此方法便是循环将message通过dispatchMessage()发送出去。dispatchMessage()方法中调用的即是我们常见的方法handleMessage().在此整个逻辑就有了闭环。
整个子线程与主线程通讯其实是将handler这个类一起传入到了内存共享区,等消息被send出去的时候再由handler进行处理
推荐阅读
-
Android的线程通信:消息机制原理(Message,Handler,MessageQueue,Looper),异步任务AsyncTask,使用JSON
-
Android异步2:深入详解 Handler+Looper+MessageQueue
-
Android Handler 机制 - Looper,Message,MessageQueue
-
Android消息通信机制Handler详解,Handler,Looper,MessageQueue,源码解析,讲解这几个类怎么配合工作的
-
Android消息处理机制(Handler、Looper、MessageQueue与Message)
-
Android异步消息处理机制 深入理解Looper、Handler、Message的关系
-
简述android线程间消息处理机制(Looper、Handler和Message)
-
Android异步消息机制-深入理解Handler、Looper和MessageQueue之间的关系
-
Android异步消息机制-深入理解Handler、Looper和MessageQueue之间的关系
-
Android消息机制分析:Handler、Looper、MessageQueue源码分析