心细两界的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类一样,但此二者其实并没有任何关系。这一点我们接下来继续详细分析。

你可能感兴趣的:(java,android,native,messgaeque)