美文网首页
Handler sendMessage过程

Handler sendMessage过程

作者: f99ad8bacb4b | 来源:发表于2018-05-02 19:03 被阅读16次

    Handler在new的时候一定先调用了Looer.prepare(),否则会抛出异常,Looper.prepare()会new一个looper对象,而Looper对象在new 的时候会new 一个MessageQueue。

    Handler的post方法和sendMessage方法以及Message的sendToTarget方法最终都会调用Handler中的sendMessageAtTime方法,而sendMessageAtTime方法会调用MessageQueue(通过Handler对应的looper得到的)的enqueueMessage方法将Message放入消息队列中,将信息加入到消息队列后,会运行nativeWake(mPtr)这一行代码,nativeWake()是一个本地的方法,是通过这个方法在系统的底层去调用Looper.loop()方法。然后通过Looper的Looper.loop()方法将Message从消息队列里轮训读取出来,过程就是Looper.loop()里有一个死循环,当拿到符合条件的Message就调用 Msg.target.dispatchMessage(msg)(也就是handler的dispatchMessage),这个方法会先判断msg的callbak是否为空,不为空执行msg里callback的run方法,如果为空则再先判断Handler的CallBack是否为空,不为空则执行CallBack的handleMessage,为空则执行handler的handleMessage(),就是自己重写的那个。

    Message新建对象要用Message.obtain()内部维护了一个消息池,性能会更好,MessageQueue和Looper里会回收message。

    相关文章

      网友评论

          本文标题:Handler sendMessage过程

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