从源码与官方文档看之Handler篇(三)

简介: 前面我们说到dispatchMessage方法,今天我们继续往下看源码。

正篇

首先后面有两个抛弃的方法:

@Deprecated
public Handler() {
    this(null, false);
}
@Deprecated
public Handler(@Nullable Callback callback) {
    this(callback, false);
}

这两个默认构造方法因为不安全,它们与当前线程的 Looper 相关联,而如果该线程没有 Looper,则该处理程序将无法接收消息,从而会引发异常。 接着我们继续看其他构造方法:

/**
 * Use the provided {@link Looper} instead of the default one.
 *
 * @param looper The looper, must not be null.
 */
public Handler(@NonNull Looper looper) {
    this(looper, null, false);
}
/**
 * Use the provided {@link Looper} instead of the default one and take a callback
 * interface in which to handle messages.
 *
 * @param looper The looper, must not be null.
 * @param callback The callback interface in which to handle messages, or null.
 */
public Handler(@NonNull Looper looper, @Nullable Callback callback) {
    this(looper, callback, false);
}

其中第一个构造函数是使用提供的Looper而不是默认的,且参数looper不能为空; 而第二个构造函数与第一个类似,不过增加了一个回调接口来处理消息,该回调接口可以为null

这里要注意的是这里调用的this()方法中的boolean参数是用来判断是否需要异步处理消息,后面的其他构造函数注释中有相应的解释。

我们接着往下看:

/**
 * Use the {@link Looper} for the current thread
 * and set whether the handler should be asynchronous.
 *
 * Handlers are synchronous by default unless this constructor is used to make
 * one that is strictly asynchronous.
 *
 * Asynchronous messages represent interrupts or events that do not require global ordering
 * with respect to synchronous messages.  Asynchronous messages are not subject to
 * the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}.
 *
 * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for
 * each {@link Message} that is sent to it or {@link Runnable} that is posted to it.
 *
 * @hide
 */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public Handler(boolean async) {
    this(null, async);
}

这个构造方法是为当前线程使用 Looper 并设置handler是否应该是异步的。我们在默认情况下,Handlers是同步的,除非使用此构造函数来创建一个严格异步的Handler。注释翻译说: 异步消息表示不需要对同步消息进行全局排序的中断或事件,而且异步消息不受 MessageQueue.enqueueSyncBarrier(long) 引入的同步屏障的影响。

参数:async – 如果为 true,则处理程序为发送给它的每个 Message 或发布给它的 Runnable 调用 Message.setAsynchronous(boolean)。

(未完待续)

相关文章
|
5月前
|
人工智能 Cloud Native 应用服务中间件
Higress 加入 CNCF:保障 Nginx Ingress 迁移,提供企业级 AI 网关
我们期待与 CNCF 生态携手,共建安全、可扩展、AI 友好的云原生基础设施。
675 31
|
5月前
|
C#
C# switch语句的用法详解
C#中switch语句用于多分支选择,根据表达式值匹配case执行对应代码块。支持整型、枚举类型,需遵守case值为常量、break防穿透等规则,default为可选默认分支。
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
434 0
|
BI 开发工具 开发者
App全渠道统计方案:如何用一个工具整合所有获客渠道数据?
还在为地推、社群、广告等不同获客渠道的数据分散而烦恼吗?本文将教您如何用一个工具整合所有渠道数据,实现精准的渠道归因与效果分析。
539 0
【MCP教程系列】当阿里云百炼智能体携带MCP,超级GitHub运营即刻上岗
阿里云百炼提供了一系列预置的MCP服务,无需自行部署或支付资源费用。通过简单几步,即可在智能体中添加MCP服务,自动实现调用兼容。
1561 0
|
传感器 监控 物联网
《解锁分布式软总线:构建智能设备统一管理平台》
随着智能设备数量激增,如何有效管理这些设备成为一大挑战。分布式软总线技术应运而生,作为一种创新通信技术,它整合Wi-Fi、蓝牙、NFC等优势,打破设备间连接壁垒,提供统一通信接口,极大降低开发难度。通过设备自发现机制、灵活组网方式及抽象控制模型,分布式软总线实现了设备的统一管理。在智能家居中,用户可一键控制多品牌设备;智能办公场景下,任务可在多设备间无缝流转;工业互联网领域,实时监控与智能调度显著提升生产效率。这一技术为智能化生活和工作提供了强大支撑,推动各行业向数字化、智能化发展。
463 0
|
人工智能 智能设计 算法
中传广告学院x阿里云设计中心《通义高校百万创作人》AIGC宣传片共建校企合作实践平台
中传广告学院x阿里云设计中心《通义高校百万创作人》AIGC宣传片共建校企合作实践平台
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。
1325 1
|
XML 搜索推荐 Java
Elasticsearch集成到Spring Boot项目
将Elasticsearch集成到Spring Boot项目中,可以方便地实现数据的搜索、分析等功能。
884 2
|
SQL 关系型数据库 分布式数据库
PolarDB常见问题之安装postgis报错如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。