Saiba como usar a Biblioteca Cronet para realizar operações de rede no seu app para Android. A Cronet é a pilha de rede do Chromium disponibilizada como uma biblioteca para você usar nos seus apps. Para ver mais informações sobre os recursos da biblioteca, consulte Realizar operações de rede usando a Cronet.
Configurar a biblioteca no projeto
Siga estas etapas para adicionar uma dependência à Biblioteca Cronet no projeto:
Verifique se o Android Studio incluiu uma referência ao repositório Maven do Google no arquivo de nível superior
build.gradle
do projeto, conforme mostrado no exemplo a seguir:allprojects { repositories { ... google() } }
Inclua uma referência à biblioteca de cliente do Google Play Services para a Cronet na seção
dependencies
do arquivo de módulo do aplicativobuild.gradle
, conforme mostrado no exemplo a seguir:dependencies { implementation 'com.google.android.gms:play-services-cronet:16.0.0' }
CronetEngine
objetos criados depois que essa dependência for adicionada usarão a Cronet carregada dos serviços do Google Play. ChameCronetProviderInstaller.installProvider(Context)
antes de criar objetosCronetEngine
para evitar exceções inesperadas durante a criação deCronetEngine
devido a erros, como dispositivos que exigem uma versão atualizada do Google Play Services.Nos casos em que a Cronet não pode ser carregada a partir do Google Play Services, há uma implementação de menor desempenho da API da Cronet que pode ser usada. Para usar essa implementação alternativa, crie a dependência
org.chromium.net:cronet-fallback
e chamenew JavaCronetProvider(context).createBuilder()
.
Criar uma solicitação de rede
Esta seção mostra como criar e enviar uma solicitação de rede usando a Biblioteca Cronet. Depois de enviar a solicitação de rede, o app deve processar a resposta da rede.
Criar e configurar uma instância do CronetEngine
A biblioteca fornece uma classe CronetEngine.Builder
que pode ser usada para criar uma instância de CronetEngine
. O exemplo a seguir mostra como criar um objeto CronetEngine
:
Kotlin
val myBuilder = CronetEngine.Builder(context) val cronetEngine: CronetEngine = myBuilder.build()
Java
CronetEngine.Builder myBuilder = new CronetEngine.Builder(context); CronetEngine cronetEngine = myBuilder.build();
A classe Builder
pode ser usada para configurar um objeto CronetEngine
, por exemplo, é possível fornecer opções como armazenamento em cache e compactação de dados. Para mais informações, consulte:CronetEngine.Builder
.
Fornecer uma implementação do callback da solicitação
Para fornecer uma implementação do callback, crie uma subclasse de UrlRequest.Callback
e implemente os métodos abstratos obrigatórios, conforme mostrado no exemplo a seguir:
Kotlin
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 to the read() 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. request?.read(ByteBuffer.allocateDirect(102400)) } override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) { Log.i(TAG, "onSucceeded method called.") } }
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(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. request.read(ByteBuffer.allocateDirect(102400)); } @Override public void onSucceeded(UrlRequest request, UrlResponseInfo info) { Log.i(TAG, "onSucceeded method called."); } }
Criar um objeto Executor para gerenciar tarefas de rede
A classe Executor
pode ser usada para executar tarefas de rede.
Para receber uma instância de Executor
, use um dos métodos estáticos da classe Executors
que retorna um objeto Executor
. O exemplo a seguir mostra como criar um objeto Executor
usando o método newSingleThreadExecutor()
:
Kotlin
val executor: Executor = Executors.newSingleThreadExecutor()
Java
Executor executor = Executors.newSingleThreadExecutor();
Criar e configurar um objeto UrlRequest
Para criar a solicitação de rede, chame o método newUrlRequestBuilder()
do CronetEngine
passando o URL de destino, uma instância da classe do callback e o objeto executor.
O método newUrlRequestBuilder()
retorna um objeto UrlRequest.Builder
que pode ser usado para criar o objeto UrlRequest
, como mostrado no exemplo a seguir:
Kotlin
val requestBuilder = cronetEngine.newUrlRequestBuilder( "https://www.example.com", MyUrlRequestCallback(), executor ) val request: UrlRequest = requestBuilder.build()
Java
UrlRequest.Builder requestBuilder = cronetEngine.newUrlRequestBuilder( "https://www.example.com", new MyUrlRequestCallback(), executor); UrlRequest request = requestBuilder.build();
A classe Builder
pode ser usada para configurar a instância de UrlRequest
. Por exemplo, é possível especificar uma prioridade ou o verbo HTTP. Para mais informações, consulte UrlRequest.Builder
.
Para iniciar a tarefa de rede, chame o método start()
da solicitação:
Kotlin
request.start()
Java
request.start();
Seguindo as instruções desta seção, é possível criar e enviar uma solicitação de rede usando a Cronet. No entanto, para simplificar, o exemplo de implementação de UrlRequest.Callback
grava apenas uma mensagem no registro. A seção a seguir mostra como fornecer uma implementação de callback compatível com cenários mais úteis, como extrair dados da resposta e detectar uma falha na solicitação.
Processar a resposta da rede
Depois de chamar o método start()
, o ciclo de vida da solicitação da Cronet é iniciado. Seu app precisa especificar um callback para gerenciar a solicitação durante o ciclo de vida. Para saber mais sobre o ciclo de vida, consulte Ciclo de vida da solicitação da Cronet. É possível especificar um callback criando uma subclasse de UrlRequest.Callback
e implementando os seguintes métodos:
onRedirectReceived()
Invocado quando o servidor emite um código de redirecionamento HTTP em resposta à solicitação original. Para seguir o redirecionamento para o novo destino, use o método
followRedirect()
. Caso contrário, use o métodocancel()
. O exemplo a seguir mostra como implementar o método:Kotlin
override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) { // Determine whether you want to follow the redirect. ... if (shouldFollow) { request?.followRedirect() } else { request?.cancel() } }
Java
@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()
Invocado quando o conjunto final de cabeçalhos é recebido. O método
onResponseStarted()
é invocado somente após todos os redirecionamentos serem seguidos. O código a seguir mostra um exemplo de implementação do método:Kotlin
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 }
Java
@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()
Invocado sempre que parte do corpo da resposta tiver sido lida. O exemplo de código a seguir mostra como implementar o método e extrair o corpo da resposta:
Kotlin
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) }
Java
@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()
Invocado quando a solicitação de rede é concluída. O exemplo a seguir mostra como implementar o método:
Kotlin
override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) { // The request has completed successfully. }
Java
@Override public void onSucceeded(UrlRequest request, UrlResponseInfo info) { // The request has completed successfully. }
onFailed()
Invocado se a solicitação falhou por qualquer motivo após o método
start()
ser chamado. O exemplo a seguir mostra como implementar o método e receber informações sobre o erro:Kotlin
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) }
Java
@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()
Invocado se a solicitação foi cancelada usando o método
cancel()
. Uma vez invocado, nenhum outro método da classeUrlRequest.Callback
é invocado. Esse método pode ser usado para liberar os recursos alocados para processar uma solicitação. O exemplo a seguir mostra como implementar o método:Kotlin
override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) { // Free resources allocated to process this request. ... }
Java
@Override public void onCanceled(UrlRequest request, UrlResponseInfo info) { // Free resources allocated to process this request. … }