loop中的queue.next 返回null的话,主线程如果没有消息,应用不应该直接退出了吗

来源:8-3 handler的消息延时是怎么实现的?

qq_有我在_3

2020-03-12

图片描述

写回答

1回答

海怪

2020-03-14

queue.next()返回null 有两钟情况

第一种情况是刚进入next()时判断mPtr等于0时会返回null

//img.mukewang.com/szimg/5e6c846a0932449109280258.jpg

第二种情况是在next()方法的for循环中判断mQuitting为true时返回null

//img1.sycdn.imooc.com/szimg/5e6c848709933a7d13920725.jpg

但是这两种情况在主线程Looper中MessageQueue里是不会发生的

因为主线程中Looper的MessageQueue初始化时被设置为不可退出的消息队列,mQuitAllowed字段为false,

//img.mukewang.com/szimg/5e6c84c7095ac59b10230257.jpg


//img.mukewang.com/szimg/5e6c84a109b133a312320731.jpg

所以在MessageQueue中mQuitting不会被赋值为true,mQuitting是false;因为mQuitting是false,导致mPtr不会被赋值为0

//img1.sycdn.imooc.com/szimg/5e6c855609d4d69512550718.jpg

所以主线程中Looper里面的MessageQueue的next()方法是不会返回null的,Looper不会退出消息循环

//img.mukewang.com/szimg/5e6c848709933a7d13920725.jpg

1
0

剖析Framework面试 冲击Android高级职位

一手助力冲刺Android高级职位,一手把握系统底层原理,理清面试思路,提升技术段位

1406 学习 · 187 问题

查看课程