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(图)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值