一、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 }