心细两界的MessageQueue

编程入门 行业动态 更新时间:2024-10-27 17:13:02

<a href=https://www.elefans.com/category/jswz/34/1676122.html style=心细两界的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

本文发布于:2024-02-10 15:54:11,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1676124.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:心细   MessageQueue

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!