本篇内容主要讲解“Android的Looper有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android的Looper有什么用”吧!
创新互联公司长期为上千多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为王益企业提供专业的网站制作、网站建设,王益网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
这里就是告诉mEpollFd,它要监控mWakeReadPipeFd文件描述符的EPOLLIN事件,即当管道中有内容可读时,就唤醒当前正在等待管道中的内容的线程。
C++层的这个Looper对象创建好了之后,就返回到JNI层的NativeMessageQueue的构造函数,***就返回到Java层的消息 队 列MessageQueue的创建过程,这样,Java层的Looper对象就准备好了。有点复杂,我们先小结一下这一步都做了些什么事情:
A. 在Java层,创建了一个Looper对象,这个Looper对象是用来进入消息循环的,它的内部有一个消息队列MessageQueue对象mQueue;
B. 在JNI层,创建了一个NativeMessageQueue对象,这个NativeMessageQueue对象保存在Java层的消息队列对象mQueue的成员变量mPtr中;
C. 在C++层,创建了一个Looper对象,保存在JNI层的NativeMessageQueue对象的成员变量mLooper中,这个对象的作用是,当 Java层的消息队列中没有消息时,就使Android应用程序主线程进入等待状态,而当Java层的消息队列中来了新的消息后,就唤醒Android应 用程序的主线程来处理这个消息。
接着还要通过epoll_ctl函数来告诉epoll要监控相应的文件描述符的什么事件:
[cpp] view plaincopystruct epoll_event eventItem;
memset(& eventItem, 0, sizeof(epoll_event)); // zero out unused members
of data field union
eventItem.events = EPOLLIN;
eventItem.data.fd = mWakeReadPipeFd;
result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, &
eventItem);
回到ActivityThread类的main函数中,在上面这些工作都准备好之后,就调用Looper类的loop函数进入到消息循环中去了:
[cpp] view plaincopypublic class Looper { ...... public static final void loop() { Looper me = myLooper(); MessageQueue queue = me.mQueue; ...... while (true) { Message msg = queue.next(); // might block ...... if (msg != null) { if (msg.target == null) { // No target is a magic identifier for the quit message. return; } ...... msg.target.dispatchMessage(msg); ...... msg.recycle(); } } } ...... }
这里就是进入到消息循环中去了,它不断地从消息队列mQueue中去获取下一个要处理的消息msg,如果消息的target成员变量为null,就表示要 退出消息循环了,否则的话就要调用这个target对象的dispatchMessage成员函数来处理这个消息,这个target对象的类型为 Handler,下面我们分析消息的发送时会看到这个消息对象msg是如设置的。
到此,相信大家对“Android的Looper有什么用”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!