美文网首页
Handler原理

Handler原理

作者: 小二二二7 | 来源:发表于2019-08-22 22:02 被阅读0次

    Handler的主要作用是为了实现线程间通信

    Handler的整个流程中,包含了四个对象:Handler、message、messageQueue、looper
    当应用创建的时候,就会在主线程中创建handler对象

    我们把要发送的信息保存到message中,handler通过sendMessage方法将message发送到messageQueue中,looper对象不断的调用loop()方法不断的从messageQueue中取出message,交由handler处理。从而实现线程间通信。

    主线程looper.loop()为什么不阻塞主线程?

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

    应用启动时,在ActivityThread的main方法中就创建了一个当前主线程的looper(我们不需要手动开启looper),并开启了消息队列,消息队列是一个无限循环,应用的整个生命周期就是运行在这个消息循环中的,安卓是由事件驱动的,Looper.loop不断的接收处理事件,looper.loop一旦结束,应用程序的生命周期也就结束了,所以只能说事件的处理如果阻塞的话会导致ANR,而不能说looper的无限循环会导致ANR。

    loop会不会对CPU性能有过多的消耗

    在子线程创建Handler,此时由于这个线程中没有默认开启的消息队列,所以我们需要手动调用looper.prepare(),并通过looper.loop开启消息。主线程Looper从消息队列读取消息,当读完所有消息时,主线程阻塞。子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。因此loop的循环并不会对CPU性能有过多的消耗。

    参考文章
    https://www.jianshu.com/p/d5ae223e941b

    相关文章

      网友评论

          本文标题:Handler原理

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