urlname
type
Post
password
SyncToConfluence
category
Android
date
Feb 23, 2023 22:46
slug
a17ea3422e4f
icon
Button
catalog
summary
tags
Android
Handler
cover
Status
BusyTime
Status 1
status
Published

作用

  • 定时消息:to schedule messages and runnables to be executed at some point in the future
  • 跨线程调用(如 Android 中只能在 UI 线程 更新UI,子线程就不行):to enqueue an action to be performed on a different thread than your own.

相关方法

  • 主要方法:
    • post(Runnable)
    • post(Runnable)
    • postAtTime(java.lang.Runnable, long)
    • postDelayed(Runnable, Object, long)
    • sendEmptyMessage(int)
    • sendMessage(Message)
    • sendMessageAtTime(Message, long)
    • sendMessageDelayed(Message, long)
  • 区别:
    • The post versions allow you to enqueue Runnable objects to be called by the message queue when they are received
The sendMessage versions allow you to enqueue a Message object containing a bundle of data that will be processed by the Handler's handleMessage(Message) method (requiring that you implement a subclass of Handler).

使用步骤

  • 新建 Handler 对象,覆写 handleMessage(Message) 方法。
  • 新建 Message 对象,设置其携带的数据。
  • 子线程 中通过 Handler.sendMessage(Message) 方法发送信息。
  • HandlerhandleMessage(Message msg) 方法中处理消息,通知主线程作出相对应的 UI 工作。

简单使用——sendMessage

  • 下面的例子,主要是演示在点击按钮后,启动一个子线程,并在子线程中,通过 handler 机制,来通知 UI 更新
  • 简单创建 XML 布局文件:
    • 创建 Handler 对象
      • 子线程中调用:
        • 启动线程:

          简单使用——post

          • Handler 不仅提供了 sendMessage(msg) 方法来发送消息,还能使用 post(Runnable) 来发送消息,下面是一个简单的使用例子
          • 定义 Runnable 的实现类:
            • 定义 TimeConsumingThread 类:
              • 启动线程:

                简单使用——obtainMessage

                • 这个的使用与 sendMessage(msg) 类似,区别只在与,前者不需要创建 Message 对象,而后者需要
                • 因为两者极其类似,这里只列出不同的代码
                  • 子线程中调用:
                    • 在主线程中获取 :

                    细节

                    • 每一个 Handler 都会与一个 Looper 对应,而 Looper 与线程绑定,只有主线程在创建的时候,会自动初始化 MainLooper,其他线程,如果要使用 Handler,则需要手动进行准备 Looper,可以在相应的线程中调用 Looper.prepare(),否则报错

                    总结

                    • Handler 主要用于同一个进程间传递消息,主要可以三种方式可以进行传输,其效果都是等效
                    • Handler 一定要有对应的 Looper 才能正常使用

                    参考/推荐

                    Leetcode_54-螺旋矩阵OkHttp 基础使用
                    Loading...