读书频道 > 网站 > 网页设计 > 深入理解Android:卷III
2.3.1MessageQueue的创建
15-08-21    下载编辑
收藏    我要投稿   

本文所属图书 > 深入理解Android:卷III

本书在逻辑上分为4个部分Part 01(第1-2章):这是本书的基础部分,首先介绍了Android源码环境的搭建、编译和调试;然后讲解了Android进程间通信与任务调度的工具Binder与MessageQueue 这两项基础工作是深入研究立即去当当网订购
现在来分析MessageQueue是如何跨界工作的,其代码如下:
 
[MessageQueue.java-->MessageQueue.MessageQueue()]
MessageQueue() {
    nativeInit(); //构造函数调用nativeInit,该函数由Native层实现
}
nativeInit()方法的真正实现为android_os_MessageQueue_nativeInit()函数,其代码如下:
[android_os_MessageQueue.cpp-->android_os_MessageQueue_nativeInit()]
static void android_os_MessageQueue_nativeInit(JNIEnv* env, jobject obj) {
    // NativeMessageQueue是MessageQueue在Native层的代表 
    NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue();
    ......
    // 将这个NativeMessageQueue对象设置到Java层保存
    android_os_MessageQueue_setNativeMessageQueue(env, obj,
                                                  nativeMessageQueue);
}
nativeInit函数在Native层创建了一个与MessageQueue对应的NativeMessageQueue对象,其构造函数如下:
[android_os_MessageQueue.cpp-->NativeMessageQueue::NativeMessageQueue()]
NativeMessageQueue::NativeMessageQueue() {
    /* 代表消息循环的Looper也在Native层中呈现身影了。根据消息驱动的知识,一个线程会有一个
      Looper来循环处理消息队列中的消息。下面一行的调用就是取得保存在线程本地存储空间
     (Thread Local Storage)中的Looper对象 */
    mLooper = Looper::getForThread();
    if (mLooper == NULL) {
        /* 如果是第一次进来,则该线程没有设置本地存储,所以需要先创建一个Looper,然后再将其保
           存到TLS中,这是很常见的一种以线程为单位的单例模式 */
        mLooper = new Looper(false);
        Looper::setForThread(mLooper);
    }
}

 

 
Native的Looper是Native世界中参与消息循环的一位重要角色。虽然它的类名和Java层的Looper类一样,但此二者其实并无任何关系。这一点以后还将详细分析。
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站