中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android構造函數怎么實現

發布時間:2021-12-18 16:42:25 來源:億速云 閱讀:206 作者:iii 欄目:移動開發

本篇內容介紹了“Android構造函數怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

簡單來說,管道就是一個文件,在管道的兩端,分別是兩個打開文件文件描述符,這兩個打開文件描述符都是對應同一個文件,   其中一個是用來讀的,別一個是用來寫的,一般的使用方式就是,一個線程通過讀文件描述符中來讀管道的內容,當管道沒有內容時,這個線程就會進入等待狀態,   而另外一個線程通過寫文件描述符來向管道中寫入內容,寫入內容的時候,如果另一端正有線程正在等待管道中的內容,那么這個線程就會被喚醒。

這個等待和喚醒 的操作是如何進行的呢,這就要借助Linux系統中的epoll機制了。

Linux系統中的epoll機制為處理大批量句柄而作了改進的poll,是Linux下多路復用IO接口select/poll的增強版本,它能顯著減   少程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率。

但是這里我們其實只需要監控的IO接口只有mWakeReadPipeFd一個,即前面我們所創建的管道的讀端,為什么還需要用到epoll呢?有點用牛刀來殺雞的味道。

其實不然,這個Looper類是非常強大的,它除了監控內部所創建的管 道接口之外,還提供了addFd接口供外界面調用,外界可以通過這個接口把自己想要監控的IO事件一并加入到這個Looper對象中去,當所有這些被監控  的IO接口上面有事件發生時,就會喚醒相應的線程來處理,不過這里我們只關心剛才所創建的管道的IO事件的發生。

我們再回到NativeMessageQueue的構造函數中,看看JNI層的Looper對象的創建過程,即看看它的構造函數是如何實現的,這個Looper類實現在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 ...... }

這個構造函數做的事情非常重要,它跟我們后面要介紹的應用程序主線程在消息隊列中沒有消息時要進入等待狀態以及當消息隊列有消息時要把應用程序主線程喚醒的這兩個知識點息息相關。它主要就是通過pipe系統調用來創建了一個管道了:

  1. [cpp] view plaincopyint wakeFds[2]; 

  2.  int result = pipe(wakeFds); 

  3.  ...... 

  4.  mWakeReadPipeFd = wakeFds[0]; 

  5.  mWakeWritePipeFd = wakeFds[1];

要使用Linux系統的epoll機制,首先要通過epoll_create來創建一個epoll專用的文件描述符:

[cpp] view plaincopymEpollFd = epoll_create(EPOLL_SIZE_HINT);

傳入的參數EPOLL_SIZE_HINT是在這個mEpollFd上能監控的***文件描述符數。

“Android構造函數怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

景洪市| 大理市| 崇义县| 玉树县| 于田县| 洪江市| 九台市| 千阳县| 万荣县| 汕尾市| 若羌县| 肥西县| 平顶山市| 平顺县| 孝感市| 奇台县| 化德县| 黄石市| 武功县| 四川省| 洛川县| 丁青县| 铜梁县| 汨罗市| 阳信县| 兴隆县| 青龙| 澄迈县| 合江县| 苏尼特右旗| 沈丘县| 望都县| 连城县| 洛南县| 舞钢市| 东光县| 古田县| 沙湾县| 七台河市| 绵阳市| 彩票|