Узнайте, как использовать библиотеку Cronet для выполнения сетевых операций в приложении Android. Cronet — это сетевой стек Chromium, доступный в виде библиотеки, которую вы можете использовать в своих приложениях. Дополнительные сведения о функциях библиотеки см. в разделе «Выполнение сетевых операций с помощью Cronet» .
Настройте библиотеку в своем проекте
Выполните следующие действия, чтобы добавить зависимость к библиотеке Cronet в вашем проекте:
Убедитесь, что Android Studio включила ссылку на репозиторий Google Maven в файл
settings.gradle
вашего проекта, как показано в следующем примере:классный
dependencyResolutionManagement { ... repositories { ... google() } }
Котлин
dependencyResolutionManagement { ... repositories { ... google() } }
Включите ссылку на клиентскую библиотеку сервисов Google Play для Cronet в раздел
dependencies
файлаbuild.gradle
вашего модуля приложения, как показано в следующем примере:классный
dependencies { implementation 'com.google.android.gms:play-services-cronet:18.0.1' }
Котлин
dependencies { implementation("com.google.android.gms:play-services-cronet:18.0.1") }
Объекты CronetEngine
, созданные после добавления этой зависимости, будут использовать Cronet, загруженный из сервисов Google Play. Вызовите CronetProviderInstaller.installProvider(Context)
перед созданием объектов CronetEngine
, чтобы предотвратить возникновение неожиданных исключений во время создания CronetEngine
из-за таких ошибок, как устройства, требующие обновленной версии сервисов Google Play.
В тех случаях, когда Cronet невозможно загрузить из сервисов Google Play, можно использовать менее производительную реализацию API Cronet. Чтобы использовать эту резервную реализацию, используйте org.chromium.net:cronet-fallback
и вызовите new JavaCronetProvider(context).createBuilder()
.
Создать сетевой запрос
В этом разделе показано, как создать и отправить сетевой запрос с помощью библиотеки Cronet. После отправки сетевого запроса ваше приложение должно обработать ответ сети .
Создайте и настройте экземпляр CronetEngine.
Библиотека предоставляет класс CronetEngine.Builder
, который можно использовать для создания экземпляра CronetEngine
. В следующем примере показано, как создать объект CronetEngine
:
Котлин
val myBuilder = CronetEngine.Builder(context) val cronetEngine: CronetEngine = myBuilder.build()
Ява
CronetEngine.Builder myBuilder = new CronetEngine.Builder(context); CronetEngine cronetEngine = myBuilder.build();
Вы можете использовать класс Builder
для настройки объекта CronetEngine
, например, вы можете предоставить такие параметры, как кэширование и сжатие данных. Для получения дополнительной информации см. CronetEngine.Builder
.
Предоставить реализацию обратного вызова запроса
Чтобы обеспечить реализацию обратного вызова, создайте подкласс UrlRequest.Callback
и реализуйте необходимые абстрактные методы, как показано в следующем примере:
Котлин
private const val TAG = "MyUrlRequestCallback" class MyUrlRequestCallback : UrlRequest.Callback() { override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) { Log.i(TAG, "onRedirectReceived method called.") // You should call the request.followRedirect() method to continue // processing the request. request?.followRedirect() } override fun onResponseStarted(request: UrlRequest?, info: UrlResponseInfo?) { 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 for the read() method. The same buffer // with data is passed to the onReadCompleted() method. request?.read(ByteBuffer.allocateDirect(102400)) } override fun onReadCompleted(request: UrlRequest?, info: UrlResponseInfo?, byteBuffer: ByteBuffer?) { Log.i(TAG, "onReadCompleted method called.") // You should keep reading the request until there's no more data. byteBuffer.clear() request?.read(byteBuffer) } override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) { Log.i(TAG, "onSucceeded method called.") } }
Ява
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 for the read() method. The same buffer // with data is passed to the onReadCompleted() method. request.read(ByteBuffer.allocateDirect(102400)); } @Override public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) { Log.i(TAG, "onReadCompleted method called."); // You should keep reading the request until there's no more data. byteBuffer.clear(); request.read(byteBuffer); } @Override public void onSucceeded(UrlRequest request, UrlResponseInfo info) { Log.i(TAG, "onSucceeded method called."); } }
Создайте объект «Исполнитель» для управления сетевыми задачами.
Вы можете использовать класс Executor
для выполнения сетевых задач. Чтобы получить экземпляр Executor
, используйте один из статических методов класса Executors
, которые возвращают объект Executor
. В следующем примере показано, как создать объект Executor
с помощью метода newSingleThreadExecutor()
:
Котлин
val executor: Executor = Executors.newSingleThreadExecutor()
Ява
Executor executor = Executors.newSingleThreadExecutor();
Создайте и настройте объект UrlRequest.
Чтобы создать сетевой запрос, вызовите метод newUrlRequestBuilder()
CronetEngine
передав целевой URL, экземпляр вашего класса обратного вызова и объект исполнителя. Метод newUrlRequestBuilder()
возвращает объект UrlRequest.Builder
, который можно использовать для создания объекта UrlRequest
, как показано в следующем примере:
Котлин
val requestBuilder = cronetEngine.newUrlRequestBuilder( "https://www.example.com", MyUrlRequestCallback(), executor ) val request: UrlRequest = requestBuilder.build()
Ява
UrlRequest.Builder requestBuilder = cronetEngine.newUrlRequestBuilder( "https://www.example.com", new MyUrlRequestCallback(), executor); UrlRequest request = requestBuilder.build();
Вы можете использовать класс Builder
для настройки экземпляра UrlRequest
. Например, вы можете указать приоритет или команду HTTP. Дополнительные сведения см. в UrlRequest.Builder
.
Чтобы запустить сетевую задачу, вызовите метод start()
запроса:
Котлин
request.start()
Ява
request.start();
Следуя инструкциям в этом разделе, вы сможете создать и отправить сетевой запрос с помощью Cronet. Однако для простоты пример реализации UrlRequest.Callback
печатает только сообщение в журнал. В следующем разделе показано, как обеспечить реализацию обратного вызова, которая поддерживает более полезные сценарии, такие как извлечение данных из ответа и обнаружение сбоя в запросе.
Обработка ответа сети
Как только вы вызываете метод start()
, запускается жизненный цикл запроса Cronet. Ваше приложение должно управлять запросом в течение жизненного цикла, указав обратный вызов. Дополнительные сведения о жизненном цикле см. в разделе Жизненный цикл запроса Cronet . Вы можете указать обратный вызов, создав подкласс UrlRequest.Callback
и реализовав следующие методы:
-
onRedirectReceived()
Вызывается, когда сервер выдает код перенаправления HTTP в ответ на исходный запрос. Чтобы следовать за перенаправлением в новый пункт назначения, используйте метод
followRedirect()
. В противном случае используйте методcancel()
. В следующем примере показано, как реализовать метод:Котлин
override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) { // Determine whether you want to follow the redirect. ... if (shouldFollow) { request?.followRedirect() } else { request?.cancel() } }
Ява
@Override public void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) { // Determine whether you want to follow the redirect. … if (shouldFollow) { request.followRedirect(); } else { request.cancel(); } }
-
onResponseStarted()
Вызывается при получении окончательного набора заголовков. Метод
onResponseStarted()
вызывается только после выполнения всех перенаправлений. В следующем коде показан пример реализации метода:Котлин
override fun onResponseStarted(request: UrlRequest?, info: UrlResponseInfo?) { val httpStatusCode = info?.httpStatusCode if (httpStatusCode == 200) { // The request was fulfilled. Start reading the response. request?.read(myBuffer) } else if (httpStatusCode == 503) { // The service is unavailable. You should still check if the request // contains some data. request?.read(myBuffer) } responseHeaders = info?.allHeaders }
Ява
@Override public void onResponseStarted(UrlRequest request, UrlResponseInfo info) { int httpStatusCode = info.getHttpStatusCode(); if (httpStatusCode == 200) { // The request was fulfilled. Start reading the response. request.read(myBuffer); } else if (httpStatusCode == 503) { // The service is unavailable. You should still check if the request // contains some data. request.read(myBuffer); } responseHeaders = info.getAllHeaders(); }
-
onReadCompleted()
Вызывается всякий раз, когда считывается часть тела ответа. В следующем примере кода показано, как реализовать метод и извлечь тело ответа:
Котлин
override fun onReadCompleted(request: UrlRequest?, info: UrlResponseInfo?, byteBuffer: ByteBuffer?) { // The response body is available, process byteBuffer. ... // Continue reading the response body by reusing the same buffer // until the response has been completed. byteBuffer?.clear() request?.read(myBuffer) }
Ява
@Override public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) { // The response body is available, process byteBuffer. … // Continue reading the response body by reusing the same buffer // until the response has been completed. byteBuffer.clear(); request.read(myBuffer); }
-
onSucceeded()
Вызывается при успешном завершении сетевого запроса. В следующем примере показано, как реализовать метод:
Котлин
override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) { // The request has completed successfully. }
Ява
@Override public void onSucceeded(UrlRequest request, UrlResponseInfo info) { // The request has completed successfully. }
-
onFailed()
Вызывается, если запрос по какой-либо причине не выполнен после вызова метода
start()
. В следующем примере показано, как реализовать метод и получить информацию об ошибке:Котлин
override fun onFailed(request: UrlRequest?, info: UrlResponseInfo?, error: CronetException?) { // The request has failed. If possible, handle the error. Log.e(TAG, "The request failed.", error) }
Ява
@Override public void onFailed(UrlRequest request, UrlResponseInfo info, CronetException error) { // The request has failed. If possible, handle the error. Log.e(TAG, "The request failed.", error); }
-
onCanceled()
Вызывается, если запрос был отменен с помощью метода
cancel()
. После вызова никакие другие методы классаUrlRequest.Callback
не вызываются. Вы можете использовать этот метод, чтобы освободить ресурсы, выделенные для обработки запроса. В следующем примере показано, как реализовать метод:Котлин
override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) { // Free resources allocated to process this request. ... }
Ява
@Override public void onCanceled(UrlRequest request, UrlResponseInfo info) { // Free resources allocated to process this request. … }