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