日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析(9)

這里,首先是調(diào)用epoll_wait函數(shù)來看看epoll專用文件描述符mEpollFd所監(jiān)控的文件描述符是否有IO事件發(fā)生,它設(shè)置監(jiān)控的超時(shí)時(shí)間為timeoutMillis:

創(chuàng)新互聯(lián)主營洛陽網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā)公司,洛陽h5微信小程序搭建,洛陽網(wǎng)站營銷推廣歡迎洛陽等地區(qū)企業(yè)咨詢

 
 
  1. [cpp] view plaincopyint eventCount = epoll_wait(mEpollFd, eventItems, 
  2. EPOLL_MAX_EVENTS, timeoutMillis); 

回憶一下前面的looper的構(gòu)造函數(shù),我們在里面設(shè)置了要監(jiān)控mWakeReadPipeFd文件描述符的EPOLLIN事件。

當(dāng)mEpollFd所監(jiān)控的文件描述符發(fā)生了要監(jiān)控的IO事件后或者監(jiān)控時(shí)間超時(shí)后,線程就從epoll_wait返回了,否則線程就會(huì)在epoll_wait函數(shù)中進(jìn)入睡眠狀態(tài)了。

返回后如果eventCount等于0,就說明是超時(shí)了:

 
 
  1. [cpp] view plaincopyif (eventCount == 0) { 
  2. ...... 
  3. result = ALOOPER_POLL_TIMEOUT; 
  4. goto Done; 

如果eventCount不等于0,就說明發(fā)生要監(jiān)控的事件:

 
 
  1.  [cpp] view plaincopyfor (int i = 0; i < eventCount; i++) { 
  2.   int fd = eventItems[i].data.fd; 
  3.   uint32_t epollEvents = eventItems[i].events; 
  4.   if (fd == mWakeReadPipeFd) { 
  5.   if (epollEvents & EPOLLIN) { 
  6.   awoken(); 
  7.   } else { 
  8.   LOGW("Ignoring unexpected epoll events 0x%x on wake read pipe.", 
  9. epollEvents); 
  10.   } 
  11.   } else { 
  12.   ...... 
  13.   } 
  14.   } 

這里我們只關(guān)注mWakeReadPipeFd文件描述符上的事件,如果在mWakeReadPipeFd文件描述符上發(fā)生了EPOLLIN就說明應(yīng)用程 序中的消息隊(duì)列里面有新的消息需要處理了,接下來它就會(huì)先調(diào)用awoken函數(shù)清空管道中把內(nèi)容,以便下次再調(diào)用pollInner函數(shù)時(shí),知道自從上次 處理完消息隊(duì)列中的消息后,有沒有新的消息加進(jìn)來。

函數(shù)awoken的實(shí)現(xiàn)很簡單,它只是把管道中的內(nèi)容都讀取出來:

 
 
  1. [cpp] view plaincopyvoid Looper::awoken() { 
  2. ...... 
  3. char buffer[16]; 
  4. ssize_t nRead; 
  5. do { 
  6. nRead = read(mWakeReadPipeFd, buffer, sizeof(buffer)); 
  7. } while ((nRead == -1 && errno == EINTR) || nRead == 
  8. zeof(buffer)); 

因?yàn)楫?dāng)其它的線程向應(yīng)用程序的消息隊(duì)列加入新的消息時(shí),會(huì)向這個(gè)管道寫入新的內(nèi)容來通知應(yīng)用程序主線程有新的消息需要處理了,下面我們分析消息的發(fā)送的時(shí)候?qū)?huì)看到。

這樣,消息的循環(huán)過程就分析完了,這部分邏輯還是比較復(fù)雜的,它利用Linux系統(tǒng)中的管道(pipe)進(jìn)程間通信機(jī)制來實(shí)現(xiàn)消息的等待和處理,不過,了解了這部分內(nèi)容之后,下面我們分析消息的發(fā)送和處理就簡單多了。


本文標(biāo)題:Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析(9)
當(dāng)前鏈接:http://www.5511xx.com/article/djoehpj.html