心细两界的MessageQueue
Posted 巷子里的旧少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了心细两界的MessageQueue相关的知识,希望对你有一定的参考价值。
在一个以消息驱动的系统中,最重要的两部分就是消息队列和消息处理循环。在andrid2.3以前,只有Java世界的居民有资格MessageQueue中添加消息以驱动Java世界的正常运转,但从android2.3开始,MessageQueue的核心部分下移只Native层,让Netaive世界的居民能利用消息循环来处理他们所在世界的事情,因此MessageQueue心系两个世界。
MessageQueue创建 现在来分析MessageQueue是如何跨界工作的,其代码如下:
MessageQueue.java::MessageQueue
MessageQueue()
NativeInit();//构造函数嗲用NativeInit,该函数有Native层实现
NativeInit函数真正实现为android_os_MessageQueue_nativeInit其代码如下:
static void andoid_os_MessageQueue_nativieInit
(JNIEnv*env,jobject obj)
//NatvieMessageQueue是MessageQueue在native层的代表
NatvieMessageQueue* natvi=new NatvieMessageQueue();
......
//将这个NativeMessageQueue对象设置到java层保存
android_os_MessageQueue_setNativeMessageQueue(evn,obj,natvi)
nativeInit函数在Native层创建了一个与MessageQueue对应的NativeMessageQueue对象,其构造函数如下:
NativeMessageQueue ::NativeMessageQueue
/**
*代表消息循环的Looper也在Native层中出现了,根据消息驱动知识,
*一个线程会有一个Looper来循环处理消息队列中的消息,下面一行的调
*用就是取得保存在线程本地存储(ThreadLocalStorageLooper对象
*/
mLooper=Looper::getForThread();
if(mLooper==NULL)
/**
* 如为第一次进来,则该线程没有设置本地存储,所以须先创建一
* Looper,然后再将保存到TLS中,这是很常见的一种线程为单位
* 的单例模式
*/
mLooper=new Looper(false);
Looper:setForThread(mLooper);
Natvie 的Looper是Native世界中参与消息循环的一位重要角色。虽然它的类名和java层的Looper类一样,但此二者其实并没有任何关系。这一点我们接下来继续详细分析。
以上是关于心细两界的MessageQueue的主要内容,如果未能解决你的问题,请参考以下文章
《隐歌雀》epub 隐歌雀 txt pdf 隐歌雀mobi 电子书下载
Android中线程间通信原理分析:Looper,MessageQueue,Handler