Android NDK开发详解连接性之Cronet 请求生命周期
本文介绍了使用 Cronet 库创建的请求的生命周期,以及如何使用该库提供的回调方法管理此类请求。
生命周期概览
使用 Cronet 库创建的网络请求由 UrlRequest 类表示。以下概念对于理解 UrlRequest 生命周期至关重要:
状态
状态是请求在特定时间所处的特定状况。使用 Cronet 库创建的 UrlRequest 对象在其生命周期中会经历不同的状态。请求生命周期包括初始状态以及多个过渡状态和最终状态。
UrlRequest 方法
客户端可以根据 UrlRequest 对象的状态对其调用特定的方法。方法会将请求从一种状态转换为另一种状态。
Callback 方法
通过实现 UrlRequest.Callback 类的方法,您的应用可以接收有关请求进度的动态更新。您可以实现多种回调方法,从而调用 UrlRequest 对象的方法,将生命周期从一种状态转换为另一种状态。
以下列表介绍了 UrlRequest 生命周期的流程:
应用调用 start() 方法后,生命周期处于已开始状态。
服务器可能会发送重定向响应,该响应会将流程引导至 onRedirectReceived() 方法。在此方法中,您可以执行以下任一客户端操作:
使用 followRedirect() 跟踪重定向。此方法会将请求恢复为已开始状态。
使用 cancel() 取消请求。此方法会将请求引导至 onCanceled() 方法,借助该方法,应用可以在请求转换为已取消这一最终状态之前执行其他操作。
应用跟踪所有重定向后,服务器会发送响应标头,还会调用 onResponseStarted() 方法。请求处于 Waiting for read() 状态。应用应该会调用 read() 方法来尝试读取部分响应正文。调用 read() 之后,请求处于正在读取状态,并可能出现以下结果:
读取操作已成功完成,但还存在更多可用数据。已调用 onReadCompleted(),且请求再次处于 Waiting for read() 状态。应用应再次调用 read() 方法,以继续读取响应正文。应用还可以使用 cancel() 方法停止读取请求。
读取操作已成功完成,没有其他可用数据。已调用 onSucceeded() 方法,请求现在处于成功这一最终状态。
读取操作失败。已调用 onFailed 方法,请求的最终状态为失败。
下图展示了 UrlRequest 对象的生命周期:
将 Cronet 和其他库一起使用
Cronet 是一款强大且灵活的工具,可以与其他库结合使用,具有最佳的实用性、简洁性和性能。
ExoPlayer
ExoPlayer 通过其 Cronet 扩展程序原生支持 Cronet。一些全球最大的在线播放应用都在使用 Cronet,其中包括 YouTube。
如需了解详情,请访问 ExoPlayer 网站。
gRPC
Cronet 可用作 Android 上 gRPC 的传输层。这样,您的 Android 应用就可以使用与 Chrome 浏览器所用的网络堆栈相同的网络堆栈创建 RPC。
如需了解详情,请访问 gRPC 代码库。
OkHttp
Cronet 团队提供了一个库,可让 OkHttp 用户将 Cronet 用作其传输层,从而受益于 QUIC/HTTP3 支持或连接迁移等功能。该库也可与其他基于 OkHttp 的库(例如 Retrofit、Coil 和 others)结合使用。
如需了解详情,请访问适用于 OkHttp 的 Cronet 传输代码库。
Glide
Cronet 是 Glide 的不错的默认选择,与 Glide 与标准 Android 网络堆栈的默认集成相比,Cronet 可提供更好的性能。
如需了解详情,请访问 Glide 网站。
Dart
可以在 Dart 中使用 Cronet 来直接替代 dart:io 软件包。
如需了解详情,请访问 Cronet Dart 绑定代码库,并阅读博文,了解其诞生的意义!