前言
Handler机制,用于线程间通信,不单单是主线程与工作线程之间,任意两个线程间都可以,其中MessageQuque对象用于持有Message对象,相当的重要,MessageQueue类位于/android/os/MessageQueue.java文件中,今天一起学学MessageQueue的实现
构造方法分析
MessageQueue(boolean quitAllowed) {
mQuitAllowed = quitAllowed;
mPtr = nativeInit();
}
创建MessageQueue对象的构造方法,传入的参数quitAllowed,表示是否允许退出(线程在循环中,读取标志位决定能否结束)
MessageQueue对象用于持有Message对象,而MessageQueue对象本身则由Looper对象持有,在Looper中会调用该构造方法创建MessageQueue对象
1、保存是否允许退出的标志位
MessageQueue对象持有的mQuitAllowd实例变量中,保存了是否允许线程退出的标志位
2、保存一个指针吗?
MessageQueue对象持有的实例变量mPtr用于保存nativeInit方法的返回值
nativeInit()方法分析
private native static long nativeInit();
nativeInit()会返回一个long值,最终由JNI层访问C/C++层的代码完成调用,这个long值不得而知,后面补充一下
总结
1、MessageQueue对持有1个称为消息列表的单链表,单链表中的每一个元素都是Message对象
2、MessageQueue对象是在Looper的构造方法中创建的,即创建Looper对象时,Looper对象会持有一个MessageQueue对
3、Looper、Handler、Message、MessageQueue,在handler机制的java层中,可见MessageQueue的地位
4、当我们创建的MesageQueue对象允许退出时,执行线程会执行方法后正常结束,反之MessageQueue对象如果不允许退出,调用MessageQueue对象方法的线程,将不会得到结束的机会,比如主线程中创建的Looper对象持有的MessageQueue对象是不允许退出的,这刚好满足GUI应用的需求,主线程不退出,保证程序可以一直运行