Skip to content
Able Blog
Home
Others
  • Home
      • 学习笔记
          • Android
            • 简历_赵思琦_Android_5年经验
                • Handler
                  • 01. handler整体架构方案原理
                    • 02. Message源码分析
                      • 03. Looper源码分析
                        • 04. ThreadLocal的使用及源码解析文章
                          • 05. MessageQueue源码解析
                            • 06. Handler源码解析
                              • handler是如何执行的
                                • 主要用途
                                  • post和sendMessageAtTime
                                    • 发送消息的方式
                                      • 立即发送
                                        • 基于时间的发送行为
                                        • 进程创建时运行消息队列
                                          • post
                                            • Handler初始化
                                              • Handler dispatchMessage()分析
                                                • Handler.handlerCallback()
                                                  • Handler.handlerMessage()
                                                  • 07. 源码阅读总结
                                                    • 08. Carson Handler总结的机制源码解析
                                                      • 09. handler 内存泄漏的原因

                                                  06. Handler源码解析

                                                  author iconAblecalendar icon2022年4月15日category icon
                                                  • Android
                                                  tag icon
                                                  • Handler
                                                  • 学习笔记
                                                  word icon约 499 字

                                                  此页内容
                                                  • handler是如何执行的
                                                  • 主要用途
                                                  • post和sendMessageAtTime
                                                  • 发送消息的方式
                                                    • 立即发送
                                                    • 基于时间的发送行为
                                                  • 进程创建时运行消息队列
                                                  • post
                                                  • Handler初始化
                                                  • Handler dispatchMessage()分析
                                                  • Handler.handlerCallback()
                                                  • Handler.handlerMessage()

                                                  # 06. Handler源码解析

                                                  # handler是如何执行的

                                                  handler 可以发送和处理线程的---> MessageQueue关联的Message和Runnable对象。

                                                  hanlder实例与单个线程和该线程的消息队列相关联

                                                  当创建一个新的Handler时,他会绑定到一个Looper,他将消息和runnable传递到Looper的消息队列并在该Looper的线程上执行他们

                                                  # 主要用途

                                                  1. 安排message和Runnable在未来某个时间点执行
                                                  2. 排队等待一个动作,在不同于自己的线程上执行

                                                  # post和sendMessageAtTime

                                                  1. post允许在接收到Runnable对象时被消息队列调用。
                                                  2. sendMessage允许将数据包的Messager对象放入队列,该数据包被Handler的HandlerMessager方法处理(需要实现Handler的子类)

                                                  # 发送消息的方式

                                                  # 立即发送

                                                  # 基于时间的发送行为

                                                  如时钟变化,超时,定时

                                                  # 进程创建时运行消息队列

                                                  当为您的应用程序创建一个进程时,它的主线程专用于运行一个消息队列,该队列负责管理顶级应用程序对象(活动、广播接收器等)以及它们创建的任何窗口。 您可以创建自己的线程,并通过 Handler 与主应用程序线程进行通信。 这是通过调用与以前相同的 <em>post</em> 或 <em>sendMessage</em> 方法来完成的,但来自您的新线程。 然后,给定的 Runnable 或 Message 将被安排在 Handler 的消息队列中,并在适当的时候进行处理。

                                                  # post

                                                  也是sendMessage,不过会从Message.Obtain()获取Message,将Message.callback=传入的runnable。在未来某个时间点执行。

                                                  # Handler初始化

                                                  • 指定Looper。 外部初始化Looper对象? 做了什么
                                                  • 默认持有 Looper.mQueue 引用
                                                  • mCallback Handler.Callback
                                                  • mAsynchronous ?

                                                  # Handler dispatchMessage()分析

                                                  callback为不为空-> handleCallback else handleMessage()

                                                   public void dispatchMessage(@NonNull Message msg) {
                                                          if (msg.callback != null) {
                                                              handleCallback(msg);
                                                          } else {
                                                              if (mCallback != null) {
                                                                  if (mCallback.handleMessage(msg)) {
                                                                      return;
                                                                  }
                                                              }
                                                              handleMessage(msg);
                                                          }
                                                      }
                                                  
                                                  1
                                                  2
                                                  3
                                                  4
                                                  5
                                                  6
                                                  7
                                                  8
                                                  9
                                                  10
                                                  11
                                                  12

                                                  # Handler.handlerCallback()

                                                  message.callback.run()

                                                  # Handler.handlerMessage()

                                                  /**
                                                       *子类实现handlerMessage方法
                                                       */
                                                      public void handleMessage(@NonNull Message msg) {
                                                      }
                                                  
                                                  1
                                                  2
                                                  3
                                                  4
                                                  5
                                                  edit icon编辑此页open in new window
                                                  上次编辑于: 2022/4/17 23:10:35
                                                  贡献者: zsqan
                                                  上一页
                                                  05. MessageQueue源码解析
                                                  下一页
                                                  07. 源码阅读总结
                                                  默认页脚
                                                  Copyright © 2022 Able