简单介绍:
1、MessageQueue(消息队列):单链表的数据结构来存储消息列表(存储单元)
作用:
插入:enqueueMessage(插入一条消息)
读取:next(读取该消息并从队列中移除该消息)此方法无限循环等新消息来从单链表移除
2、Looper(消息循环):无限循环监听是否有新消息,有就处理消息,没有一直等待着
3、ThreadLocal:可以在每个线程中存储提供数据的作用,可获取每个线程的Looper(提示:主线程是自动创建Looper的,而子线程默认是没有Looper的,需要Looper.prepareMainLooper() 或者Looper.prepare() ,创建的同时会自动创建MessageQueue ,然后Looper自动进入消息循环)
4、每个不同的线程可以通过同一个ThreadLocal都能得到相对应的数据。
发送消息的过程:
1、创建Message对象有两种方式new Message() 和 Message.obtain()
一般使用Message.obtain(),可以有效避免重复创建 Message 对象。
2、将Message对象设置的参数由handler发送:Handler.sendMessage(Message msg)和Handler.post(Runnable r)
3、没有立即发送,MessageQueue接收到消息一般通过MessageQueue.enqueueeMessage(Message msg,long when) 加入到消息队列
4、Looper进行循环接收处理消息,然后给dispatchMessage(msg)->handlerMessage()
注意:
每个Thread只能有1个Looper,但可以有多个 Handler
每个 Looper 可以有多个Handler
每个 Handler 只能有1个Looper