Android Looper 分析1

一、prepare()幹了幾件重要的事:
    依次構造了Looper(java)--> MessageQueue--> NativeMessageQueue--->Looper(native)
    1、創建java層的Looper(在哪個線程創建就屬於哪個線程)。
    2、Looper構造方法中,創建了java層的消息隊列(mQueue--MessageQueue),此時消息隊列爲空
    3、MessageQueue構造方法中,通過jni,創建了native層的消息隊列(NativeMessageQueue)。
    4、NativeMessageQueue的構造函數中,創建了native層的Looper(mLooper)。
    5、Looper(native)層的構造方法中,創建了管道(wipe),通過epoll,添加了管道的讀事件
二、looper()幹了幾件事:
    1、創建for循環,通過在prepare中創建的消息隊列mQueue,獲取消息。
    2、mQueue.next()時,通過jni進入了native層的消息隊列(mPtr),並調用pollOnce()
    3、mQueue.pollOnce(timeout),時,調用mLooper.pollOnce()--->pollInner()
    4、mLooper.pollInner()時,會調用epoll_wait,block,等待事件到來。(java層,實際等待wipe被寫入,喚醒looper)
    5、獲取到消息(handler發送的消息)後,派送消息 msg.target.dispatchMessage(msg);
 三、handler發送消息,最終是在消息隊列的消息鏈表中添加消息。、

 四、消息block

1、java和native消息都會block在epoll_wait, 等待註冊的事件發生
2、事件fd爲mWakeReadPipeFd時,是喚醒讀,實際是java層發送消息了
3、其他的事件fd,是需要手動註冊的,一般是native層addFd註冊的事件,
回調分兩種
第一種是 handler->handleMessage(message);(暫時沒找到例子)
第二種回調LooeprCallback(sensor事件回調)
4、構造mResponses,回調handleEvent
195 int Looper::pollInner(int timeoutMillis) {
222     struct epoll_event eventItems[EPOLL_MAX_EVENTS];
223     int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_MAX_EVENTS, timeoutMillis);//1
255     for (int i = 0; i < eventCount; i++) { //2  Java層消息走這裏
256         int fd = eventItems[i].data.fd;
257         uint32_t epollEvents = eventItems[i].events;
258         if (fd == mWakeReadPipeFd) {
259             if (epollEvents & EPOLLIN) {
260                 awoken();
264         } else {
265             ssize_t requestIndex = mRequests.indexOfKey(fd);  //native 事件處理
266             if (requestIndex >= 0) {
267                 int events = 0;
268                 if (epollEvents & EPOLLIN) events |= EVENT_INPUT;
269                 if (epollEvents & EPOLLOUT) events |= EVENT_OUTPUT;
270                 if (epollEvents & EPOLLERR) events |= EVENT_ERROR;
271                 if (epollEvents & EPOLLHUP) events |= EVENT_HANGUP;
272                 pushResponse(events, mRequests.valueAt(requestIndex));//langxw
273             } 
277         }
278     }


302                 handler->handleMessage(message);


318     // Invoke all response callbacks.
319     for (size_t i = 0; i < mResponses.size(); i++) {
320         Response& response = mResponses.editItemAt(i);
321         if (response.request.ident == POLL_CALLBACK) {
322             int fd = response.request.fd;
323             int events = response.events;
324             void* data = response.request.data;
329             int callbackResult = response.request.callback->handleEvent(fd, events, data);//1
337         }
338     }
339     return result;
340 }

Android Looper 分析2(圖)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章