亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

屏东县| 徐水县| 阿克苏市| 林周县| 广南县| 贡山| 井研县| 叶城县| 凤山县| 汶川县| 乾安县| 南投县| 永康市| 成安县| 中方县| 唐河县| 江陵县| 溧水县| 常熟市| 饶河县| 夹江县| 孟州市| 康平县| 紫阳县| 昆明市| 彰化市| 文成县| 白水县| 洪泽县| 黑龙江省| 神池县| 阜康市| 红安县| 如东县| 聊城市| 松溪县| 徐闻县| 开化县| 绵竹市| 安达市| 邵武市|