心细两界的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的主要内容,如果未能解决你的问题,请参考以下文章

HTML + CSS 为何得不到编程界的认可?

HTML+CSS为何得不到编程界的认可?

《隐歌雀》epub 隐歌雀 txt pdf 隐歌雀mobi 电子书下载

Android中线程间通信原理分析:Looper,MessageQueue,Handler

Android中线程间通信原理分析:Looper,MessageQueue,Handler

MessageQueue一之介绍