Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析(5)
這里就是告訴mEpollFd,它要監(jiān)控mWakeReadPipeFd文件描述符的EPOLLIN事件,即當(dāng)管道中有內(nèi)容可讀時(shí),就喚醒當(dāng)前正在等待管道中的內(nèi)容的線程。
C++層的這個(gè)Looper對(duì)象創(chuàng)建好了之后,就返回到JNI層的NativeMessageQueue的構(gòu)造函數(shù),***就返回到Java層的消息 隊(duì) 列MessageQueue的創(chuàng)建過程,這樣,Java層的Looper對(duì)象就準(zhǔn)備好了。有點(diǎn)復(fù)雜,我們先小結(jié)一下這一步都做了些什么事情:
A. 在Java層,創(chuàng)建了一個(gè)Looper對(duì)象,這個(gè)Looper對(duì)象是用來進(jìn)入消息循環(huán)的,它的內(nèi)部有一個(gè)消息隊(duì)列MessageQueue對(duì)象mQueue;
B. 在JNI層,創(chuàng)建了一個(gè)NativeMessageQueue對(duì)象,這個(gè)NativeMessageQueue對(duì)象保存在Java層的消息隊(duì)列對(duì)象mQueue的成員變量mPtr中;
C. 在C++層,創(chuàng)建了一個(gè)Looper對(duì)象,保存在JNI層的NativeMessageQueue對(duì)象的成員變量mLooper中,這個(gè)對(duì)象的作用是,當(dāng) Java層的消息隊(duì)列中沒有消息時(shí),就使Android應(yīng)用程序主線程進(jìn)入等待狀態(tài),而當(dāng)Java層的消息隊(duì)列中來了新的消息后,就喚醒Android應(yīng) 用程序的主線程來處理這個(gè)消息。
接著還要通過epoll_ctl函數(shù)來告訴epoll要監(jiān)控相應(yīng)的文件描述符的什么事件:
- [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函數(shù)中,在上面這些工作都準(zhǔn)備好之后,就調(diào)用Looper類的loop函數(shù)進(jìn)入到消息循環(huán)中去了:
- [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();
- }
- }
- }
- ......
- }
這里就是進(jìn)入到消息循環(huán)中去了,它不斷地從消息隊(duì)列mQueue中去獲取下一個(gè)要處理的消息msg,如果消息的target成員變量為null,就表示要 退出消息循環(huán)了,否則的話就要調(diào)用這個(gè)target對(duì)象的dispatchMessage成員函數(shù)來處理這個(gè)消息,這個(gè)target對(duì)象的類型為 Handler,下面我們分析消息的發(fā)送時(shí)會(huì)看到這個(gè)消息對(duì)象msg是如設(shè)置的。