1,主线程可以直接创建hander
2,子线程直接创建hander(无参数)会报错:Can't create handler inside thread that has not called Looper.prepare()
3,主线程执行Looper.prepare()或者子线程执行两遍Looper.prepare()会报错:Only one Looper may be created per thread
4,Looper. prepareMainLooper()会报错:The main Looper has already been prepared.
hander对象会需要持有Looper、MessageQueue,MessageQueue就是通过Looper获取到的,如果没有Looper的话Handler就是无法通过MessageQueue来处理消息(2),设计Looper存在ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>()里,每个线程都会存储自己的Looper,并且设计每个线程只能创建并存储一个Looper()(3),主线程的Looper是在ActivityThread的main方法中初始化的(1)(4),Handler有可以传Looper参数的构造方法,可以在子线程直接创建主线程的hander进行通信。
一个线程设计只有一个looper保证这个线程里面的Looper事件循环系统是惟一的,如果有多个肯定不利于管理。
Looper ->MessageQueue->Message->Handler
Looper持有MessageQueue loop循环处理MessageQueue的消息
MessageQueue:Message执行队列,循环取下一个要执行的message执行
Message:消息本身,持有Handler当Message执行完毕由持有的Handler处理回调
Message还持有next Message
Handler持有Looper获取MessageQueue,给MessageQueue发送消息并且把自己付给被发送的Message。