Android应用程序消息处理机制(Looper、Handler)分析(5)

移动开发 Android
这里就是告诉mEpollFd,它要监控mWakeReadPipeFd文件描述符的EPOLLIN事件,即当管道中有内容可读时,就唤醒当前正在等待管道中的内容的线程。

这里就是告诉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要监控相应的文件描述符的什么事件:

  1.   [cpp] view plaincopystruct epoll_event eventItem; 
  2.   memset(& eventItem, 0, sizeof(epoll_event)); // zero out unused members 
  3. of data field union 
  4.   eventItem.events = EPOLLIN; 
  5.   eventItem.data.fd = mWakeReadPipeFd; 
  6.   result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, & 
  7. eventItem);

回到ActivityThread类的main函数中,在上面这些工作都准备好之后,就调用Looper类的loop函数进入到消息循环中去了:

  1. [cpp] view plaincopypublic class Looper { 
  2. ...... 
  3. public static final void loop() { 
  4. Looper me = myLooper(); 
  5. MessageQueue queue = me.mQueue; 
  6. ...... 
  7. while (true) { 
  8. Message msg = queue.next(); // might block 
  9. ...... 
  10. if (msg != null) { 
  11. if (msg.target == null) { 
  12. // No target is a magic identifier for the quit message. 
  13. return
  14. ...... 
  15. msg.target.dispatchMessage(msg); 
  16. ...... 
  17. msg.recycle(); 
  18. ...... 

这里就是进入到消息循环中去了,它不断地从消息队列mQueue中去获取下一个要处理的消息msg,如果消息的target成员变量为null,就表示要 退出消息循环了,否则的话就要调用这个target对象的dispatchMessage成员函数来处理这个消息,这个target对象的类型为 Handler,下面我们分析消息的发送时会看到这个消息对象msg是如设置的。

责任编辑:闫佳明 来源: bbs.9ria
相关推荐

2014-05-22 15:48:50

Android消息处理机制Looper

2014-05-22 15:41:59

Android消息处理机制Looper

2014-05-22 15:07:44

Android消息处理机制Looper

2014-05-22 15:38:27

Android消息处理机制Looper

2014-05-22 15:04:00

Android消息处理机制Looper

2014-05-22 15:00:16

Android消息处理机制Looper

2014-05-22 15:45:58

Android消息处理机制Looper

2014-05-22 15:33:31

Android消息处理机制Looper

2014-05-22 15:18:25

Android消息处理机制Looper

2014-05-22 14:57:28

Android消息处理机制Looper

2011-04-28 11:01:40

Android消息处理LooperHandler

2011-11-23 09:33:45

HandlerLooperMessage

2014-05-27 10:13:57

移动技术半月刊

2016-10-21 13:03:18

androidhandlerlooper

2011-09-05 17:40:40

MTK定时器

2011-03-17 09:20:05

异常处理机制

2021-08-12 16:28:10

AndroidHandleLooper

2023-03-08 08:54:59

SpringMVCJava

2023-06-15 14:09:00

解析器Servlet容器

2011-07-01 14:20:59

Qt 事件
点赞
收藏

51CTO技术栈公众号