Handler机制

  • 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,我裂开

  • 参考
    https://juejin.im/post/5aa4ee1f518825556140e39c#heading-4 对为何能在主线程更新UI描述有误
    https://juejin.im/entry/59e88b735188257e0c324c17#runonuithread
    https://www.zhihu.com/question/34652589/answer/90344494
    http://gityuan.com/

你可能感兴趣的:(Handler机制)