Handler机制
- Message(消息)
- 消息的创建:
- 调用Message.obtain()方法,当sPool消息池为空就创建消息对象
- 消息的next属性:
- 消息对象通过next属性指向下一个消息对象
- 消息的when属性:
- long类型变量when,记录自己发送时间
- 消息的target成员变量:
- 消息对象中有一个Handler类型的成员变量target
- 这个target记录此消息对象是由哪个Handler创建的
- 多个Handler对象给消息队列发送消息,最终消息由谁处理,取决于消息由谁发送。(谁发送谁处理)
- 处理消息时调用Message.target.handleMessage();也就是Handler.handleMessage();
- 消息的创建:
- Handler(处理器)
- Handler的创建:
- 应用启动时候,ActivityThread主线程会创建Handler和MessageQueue,并启动Handler
- handler发送消息:
- Handler.sendMessage();发送消息
- Handler处理消息:
- Handler.handleMessag();处理消息
- Handler的创建:
- Looper(轮循器)
- Lopper何时开始轮循:
- 只有当主线程ActivityThread调用Looper.loop();才开始轮循
- Looper.loop();是个while(true){}的死循环
- Looper轮循的原理:
- 由于android的内核是Linux,所以也继承了Linux的进程间通信机制–“管道”
- 管道的原理:
- 在内存中有一个特殊的文件,这个文件有两个句柄(引用),一个是读取句柄,一个是写入句柄。
- 内存中会有一块共享空间和两个流,一个主线程的读操作,一个子线程的写操作
- 只有当子线程进行写操作时,主线程才会进行写操作
- Looper的原理:
- 主线程Looper从消息队列读取消息,当读完所有消息时,进入睡眠,主线程阻塞。
- 子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据
- 主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠
- Lopper何时开始轮循:
- MessageQueue(消息队列)
- 消息队列的数据结构:
- MessageQueue是个队列结构,但由于Message对象通过next指向下一个消息对象,所以又类似于单链表结构
- 消息入队:
- MessageQueue.enquqeueMessage(Message msg,long when);将消息入队
- MessageQueue处理消息的顺序由when决定,when越小越靠前
- 当(p == null || when==0 || when < p.when)将消息插入队首,优先处理
- 否则比较when参数确定消息所在位置
- 消息队列的数据结构: