本篇內(nèi)容介紹了“Android構(gòu)造函數(shù)怎么實現(xiàn)”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站建設、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的坡頭網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
簡單來說,管道就是一個文件,在管道的兩端,分別是兩個打開文件文件描述符,這兩個打開文件描述符都是對應同一個文件, 其中一個是用來讀的,別一個是用來寫的,一般的使用方式就是,一個線程通過讀文件描述符中來讀管道的內(nèi)容,當管道沒有內(nèi)容時,這個線程就會進入等待狀態(tài), 而另外一個線程通過寫文件描述符來向管道中寫入內(nèi)容,寫入內(nèi)容的時候,如果另一端正有線程正在等待管道中的內(nèi)容,那么這個線程就會被喚醒。
這個等待和喚醒 的操作是如何進行的呢,這就要借助Linux系統(tǒng)中的epoll機制了。
Linux系統(tǒng)中的epoll機制為處理大批量句柄而作了改進的poll,是Linux下多路復用IO接口select/poll的增強版本,它能顯著減 少程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)CPU利用率。
但是這里我們其實只需要監(jiān)控的IO接口只有mWakeReadPipeFd一個,即前面我們所創(chuàng)建的管道的讀端,為什么還需要用到epoll呢?有點用牛刀來殺雞的味道。
其實不然,這個Looper類是非常強大的,它除了監(jiān)控內(nèi)部所創(chuàng)建的管 道接口之外,還提供了addFd接口供外界面調(diào)用,外界可以通過這個接口把自己想要監(jiān)控的IO事件一并加入到這個Looper對象中去,當所有這些被監(jiān)控 的IO接口上面有事件發(fā)生時,就會喚醒相應的線程來處理,不過這里我們只關心剛才所創(chuàng)建的管道的IO事件的發(fā)生。
我們再回到NativeMessageQueue的構(gòu)造函數(shù)中,看看JNI層的Looper對象的創(chuàng)建過程,即看看它的構(gòu)造函數(shù)是如何實現(xiàn)的,這個Looper類實現(xiàn)在frameworks/base/libs/utils/Looper.cpp文件中:
[cpp] view plaincopyLooper::Looper(bool allowNonCallbacks) : mAllowNonCallbacks(allowNonCallbacks), mResponseIndex(0) { int wakeFds[2]; int result = pipe(wakeFds); ...... mWakeReadPipeFd = wakeFds[0]; mWakeWritePipeFd = wakeFds[1]; ...... #ifdef LOOPER_USES_EPOLL // Allocate the epoll instance and register the wake pipe. mEpollFd = epoll_create(EPOLL_SIZE_HINT); ...... struct epoll_event eventItem; memset(& eventItem, 0, sizeof(epoll_event)); // zero out unused members data field union eventItem.events = EPOLLIN; eventItem.data.fd = mWakeReadPipeFd; result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, & entItem); ...... #else ...... #endif ...... }
這個構(gòu)造函數(shù)做的事情非常重要,它跟我們后面要介紹的應用程序主線程在消息隊列中沒有消息時要進入等待狀態(tài)以及當消息隊列有消息時要把應用程序主線程喚醒的這兩個知識點息息相關。它主要就是通過pipe系統(tǒng)調(diào)用來創(chuàng)建了一個管道了:
[cpp] view plaincopyint wakeFds[2];
int result = pipe(wakeFds);
......
mWakeReadPipeFd = wakeFds[0];
mWakeWritePipeFd = wakeFds[1];
要使用Linux系統(tǒng)的epoll機制,首先要通過epoll_create來創(chuàng)建一個epoll專用的文件描述符:
[cpp] view plaincopymEpollFd = epoll_create(EPOLL_SIZE_HINT);
傳入的參數(shù)EPOLL_SIZE_HINT是在這個mEpollFd上能監(jiān)控的***文件描述符數(shù)。
“Android構(gòu)造函數(shù)怎么實現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
文章題目:Android構(gòu)造函數(shù)怎么實現(xiàn)
網(wǎng)頁網(wǎng)址:http://muchs.cn/article16/iejsdg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供電子商務、標簽優(yōu)化、手機網(wǎng)站建設、網(wǎng)站策劃、定制網(wǎng)站、網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)