美文网首页Android
为什么looper.loop()不会阻碍主线程

为什么looper.loop()不会阻碍主线程

作者: 暖宝宝_龍 | 来源:发表于2018-08-21 16:00 被阅读0次

    其实具体的我也看不懂,我只能说说我的最粗略的理解,配合一点点代码来看

    我们先在我们的Activity的onCreate里面写个while循环

            var i=0;
            while (true){
                i++
                Log.e("死循环","啦啦啦:${i}")
            }
    

    你们觉得会发生什么,ANR?

    其实并不会,只是走在这一步就永远的循环了,不会再走下面的代码,但是为什么没有ANR呢,我们在看看ANR出现的原因:

    造成ANR的原因一般有两种:
    当前的事件没有机会得到处理(即主线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)
    当前的事件正在处理,但没有及时完成

    那我们这个死循环有什么事情正在处理或者阻碍到了其他事件处理了吗,我什么都没做,就只打印LOG,所以不会ANR.
    到这儿了就来说说loop的简单理解吧,loop的作用其实也就是从MessageQueue中取出message叫handler发送出去,如果没有message,就不能让handler发送message,就不存在阻碍线程的地方(这儿这么说也不准确),所以就不会ANR,其实里面涉及到很多知识,我也还不懂,这个就只是最粗略的理解!
    而发送消息呢,我们也可以写成这样来看

            var i = 0;
            while (true) {
                i++
                if (i % 10 == 0)//表示MessageQueue中又得到了消息
                    Log.e("死循环", "发送消息:${i}")//表示发送一次消息
            }
    

    如果满足条件,表示其他地方向MessageQueue中放了Message,loop循环读到了,就发个消息,就等于loop中的msg.target.dispatchMessage(msg);
    然后再在handleMessage(msg)中做主线程操作,耗时的都在里面
    所以有种说法是:不是Looper.loop()阻碍了线程,是耗时操作阻碍了loop(),以这个log来说,如果log执行的时间很长了,是不是就ANR了,但是如果没有这个log,就不会出现ANR了!

    总结

    阻碍线程的不是Looper.loop(),是loop中调用handler进行主线程操作才阻碍了线程

    这个是我理解到的最片面,最简单的说法了,涉及到的内容太多,具体我也没看多少,主要作为自己的理解文章

    相关文章

      网友评论

        本文标题:为什么looper.loop()不会阻碍主线程

        本文链接:https://www.haomeiwen.com/subject/xbljiftx.html