Chromium网络堆栈之Cronet详解

一、简介

Cronet 是 Chromium 网络堆栈,可作为库提供给 Android 应用。Cronet 利用多种技术来减少延迟并提高应用正常运行所需的网络请求吞吐量。

Cronet 库每天处理数百万人所用的应用(如 YouTube、Google 应用、Google 相册以及Google 地图导航和 Google 公交)的请求。

二、功能
1、协议支持

Cronet 本身支持 HTTP 协议、HTTP/2 协议和 QUIC 协议。

2、请求优先级

该库支持您为请求设置优先级标签。服务器可以使用优先级标签来确定处理请求的顺序。

3、资源缓存

Cronet 可以使用内存缓存或磁盘缓存来存储在网络请求中检索到的资源。后续请求会自动通过缓存提供。

4、异步请求

默认情况下,使用 Cronet 库发出的网络请求是异步的。您的工作器线程在等待请求返回时不会遭到屏蔽。

5、数据压缩

Cronet 支持使用 Brotli 压缩数据格式来压缩数据。

要了解如何在 Android 应用中使用 Cronet 库,请参阅下面的使用。您还可以浏览 GitHub 上的 Cronet 示例

三、Cronet使用

此次介绍了如何使用 Cronet 库在您的 Android 应用中执行网络操作。Cronet 是 Chromium 网络堆栈,可作为库供在应用中使用。

1、在项目中设置库

要在您的项目中为 Cronet 库添加依赖项,请按以下步骤操作:

  • 在项目的顶层 build.gradle 文件中验证 Android Studio 是否包含对 Google 的 Maven 代码库的引用,如以下示例所示:
allprojects {
   
        repositories {
   
            ...
            google()
        }
    }
  • 找到应用模块的 build.gradle 文件,在 dependencies 部分中添加对 Cronet 的 Google Play 服务客户端库的引用,如以下示例所示:
dependencies {
   
        implementation 'com.google.android.gms:play-services-cronet:16.0.0'
    }

添加此依赖项后创建的 CronetEngine 对象将使用从 Google Play 服务加载的 Cronet。在创建 CronetEngine 对象之前,请调用 CronetProviderInstaller.installProvider(Context) 对象,以防止在 CronetEngine 创建期间因设备需要更新版 Google Play 服务等错误而抛出异常。

如果无法通过 Google Play 服务加载 Cronet,则只能使用 Cronet API 的一个性能不那么出色的实现。要使用此备用实现,请使用 org.chromium.net:cronet-fallback 并调用 new JavaCronetProvider(context).createBuilder()

2、创建网络请求

本部分介绍了如何使用 Cronet 库创建和发送网络请求。发送网络请求后,您的应用应处理网络响应。

2.1 创建并配置 CronetEngine 的实例

该库提供了 CronetEngine.Builder 类,您可以使用此类来创建 CronetEngine 的实例。以下示例展示了如何创建 CronetEngine 对象,分别用java和kotlin创建对象:

JAVA

  CronetEngine.Builder myBuilder = new CronetEngine.Builder(context);
  CronetEngine cronetEngine = myBuilder.build();

KOTLIN

val myBuilder = CronetEngine.Builder(context)
val cronetEngine: CronetEngine = myBuilder.build()

注意:建议您仅创建 CronetEngine 的一个实例。单个实例可以发送多个异步请求。此外,存储目录不支持多个 CronetEngine实例并发访问。如需了解详情,请参阅 setStoragePath()

您可以使用 Builder 类来配置 CronetEngine 对象,例如,您可以提供缓存和数据压缩等选项。如需了解详情,请参阅 CronetEngine.Builder

2.2 提供请求回调的实现

要提供回调的实现,请创建 UrlRequest.Callback 的子类,并实现所需的抽象方法,如以下示例所示:

JAVA

class MyUrlRequestCallback extends UrlRequest.Callback {
   
  private static final String TAG = "MyUrlRequestCallback";

  @Override
  public void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) {
   
    Log.i(TAG, "onRedirectReceived method called.");
    // You should call the request.followRedirect() method to continue
    // processing the request.
    request.followRedirect();
  }

  @Override
  public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
   
    Log.i(TAG, "onResponseStarted method called.");
    // You should call the request.read() method before the request can be
    // further processed. The following instruction provides a ByteBuffer object
    // with a capacity of 102400 bytes to the read() method.
    request.read(
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值