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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容