Handler原理核心点笔记

来源:互联网 发布:特定统计量数据模拟 编辑:程序博客网 时间:2024/06/05 07:15


      1.在Looper中prepare()用于创建一个ThreadLocal对象,并存放一个Looper实例,并且prepare()方法只能代用一次,多次调用会出异常,所以一个线程只有一个Looper对象,创建一个MessageQueque对象,用 于存放Message。


      2.Looper.loop()为一个无限循环,不断的从MessageQueque中获取消息,并且调用msg.target.dispatchMessage()      方法进行消息分发,dispatchMessage()会调用handlerMessage(Message message)接口进行更新UI。


      3.Handler在初始化的时候会调用ThreadLocal.get()获取Looper实例,所以prepare()方法必须在Handler初始化之前调用。


      4.Handler.sendMessage(Message msg)会给传入的msg内容加上当前Handler的引用,就是msg.target=this,然后再将Message放入MessageQueque。在步骤2中的msg.target就是在此时传入的。

      

     5.Activity在使用Handler的时候不用调用prepare(),loop()是因为在ActivityThread中已经调用,所以如果要在子线程中新建一个Handler就必须先调用prepare(),loop();

     

     总结:线程间通信就是一个阻塞队列