心细两界的MessageQueue"/>
心细两界的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
发布评论