标签:
1. 如果 参数 有 Looper 则 把 Looper 赋值给 mLooper 否则 则 把 当前 线程 对应的 Looper 赋值给 mLooper. 2. 获取 Looper 对应的 消息 队列 mQueue. 3. 如果 构造函数的参数中 包含 Handler.Callback 的 实例 callBack 则 把其 赋值给 mCallback 变量.
1. 要 发送的消息 内容 有 两种 一种 Runnable 另一种 Message.
通过 跟踪 post 的实现, 则 可以发现 Runnable 也 被 转化 为 Message 对象了.
图1:图2:
2. 消息发送 调用的 常见方法有 : post(Runnable), postDelayed(Runnable,long), 以及 sendEmptyMessage(int), sendMessage(Message) , sendMessageDelayed(Message,long) 这些方法都会 归宗于 : sendMessageAtTime()
在 sendMessageAtTime 中 主要 是把 Message 对应的 target 参数 设置为 当前 Handler, 然后 把 此 msg 放入 MessageQueue 队列中,
3. 消息 处理时 对应的方法回调:
handle 消息 处理的位置 有 三处:其1: 当 消息为 Runnable 消息的时候, 则 msg 的 callback (即 Runnable 对象) 是不为 空的, 则 直接 调用 msg.callback.run() 执行 回调.其2: 当我们在 构造 Handler 的时候 有 传入 Handler.Callback 回调对象的时候, 则 mCallback 不为空( 由 Handler 的构造函数 可知), 则 调用 Handler.Callback 这个 接口 对应的 handleMessage() 方法.其3: 如果 没有前面 两种, 则 在 创建 Handler 的 子类 或者 匿名对象的时候 会 重载 handleMessage 来 处理对应的 回调逻辑.
当 调用 Looper 的静态 方法 prepare() 的时候则 会创建 一个 Looper 对象, 并设置 到一个 静态的县城局部变量中去.在 Looper 的构造函数中, 可以看到 会创建 一个 MessageQueue 对象, MessageQueue 作为 消息队列.
一个线程 调用 prepare() 只是 准备好了消息队列, 进入 消息队列的 等待, 则是 调用 Looper 的 loop() 方法:透过 loop() 方法的实现, 可以知道 首先从 当前 线程对应的 Looper 中 获取到 对应的消息 队列, 然后 从 消息 队列中 获取 下一条 要执行 的 message, 当 获取到的 Message 为 null 的时候则 直接退出循环.如果 msg 不为null, 则 调用 Message 中 对应的 Handler 对象的 dispatchMessage 方法 进行消息的分发. 消息的具体分发 已在上面 讲过了.在 queue.next() 语句的 上面 可以 看到 for 循环 是一个 死 循环, 则 可以知道 当 线程 调用 loop() 方法之后 就不会 继续往 下执行, 而 是在 等待 消息列表(queue) 返回消息 , 然后 将 消息 丢给 Handler 进行处理.
线程间通信: Handler , Looper, MessageQueue, Message (完结)
标签:
原文地址:http://www.cnblogs.com/devinzhou/p/3578157.html