美文网首页
Handler机制

Handler机制

作者: LeoFranz | 来源:发表于2019-08-29 17:30 被阅读0次
    • handler中的looper如何与当前线程绑定

    handler实例化的时候会构造对应该handler的looper和messageQueue,而当前线程的looper和messageQueue是在Looper.prepare方法中实例化并借助ThreadLocal.set方法与当前looper绑定到当前线程(当前线程就是调用Looper.prepare方法的线程)。

    实例化looper时候已经将messageQueue实例化了。

    主线程中生成handler时候为什么没有调用prepare()方法生成looper实例并将其绑定到当前线程?因为activityThread的main方法中已经生成了一个looper(Looper.prepareMainLooper()方法),然后通过Looper.loop()让这主线程循环调用起来。

    • handler如何往looper中存取消息?
      sendMessage方法中进入enqueueMessage方法,然后通过msg.target = this;将handler和message进行绑定,最后能够将message加入到queue末尾。
      获取message是通过Looper.loop()中无限循环获取queue的下一个message,直到queue为空,如果message不为空就调用msg.target.dispatchMessage(msg);这样就将message通过handler处理了。

    • 无限循环中如何保证主线程不被卡死
      线程默认没有Looper的,如果需要使用Handler就必须为线程创建Looper。我们经常提到的主线程,也叫UI线程,它就是ActivityThread,ActivityThread被创建时就会初始化Looper,这也是在主线程中默认可以使用Handler的原因。
      Android中为什么主线程不会因为Looper.loop()里的死循环卡死? - Gityuan的回答 - 知乎

    • 子线程中更新UI方式
      1、在子线程中给Handler赋予looper,要知道当handler绑定了looper,其发送的message就是在looper对应的Thread中处理的。
      2、调用runOnUIThread,内部机制和主线程handler一致
      3、调用view.post方法,实现通过绑定了sMainLooper的handler
      4、利用AsyncTask更新UI,也是通过handler,我裂开

    相关文章

      网友评论

          本文标题:Handler机制

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