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();
总结:线程间通信就是一个阻塞队列