Aprenda a usar a Biblioteca Cronet para realizar operações de rede no seu App Android. A Cronet é a pilha de rede do Chromium disponibilizada como uma biblioteca para você usar nos seus apps. Para mais informações sobre os recursos da biblioteca, consulte Executar operações de rede usando Cronet (link em inglês).
Configurar a biblioteca no projeto
Siga estas etapas para adicionar uma dependência à Biblioteca Cronet no projeto:
Verificar se o Android Studio incluiu uma referência ao repositório Maven do Google no arquivo
settings.gradle
do seu projeto, conforme mostrado abaixo exemplo:Groovy
dependencyResolutionManagement { ... repositories { ... google() } }
Kotlin
dependencyResolutionManagement { ... repositories { ... google() } }
Incluir uma referência à biblioteca de cliente do Google Play Services para a Cronet na seção
dependencies
do arquivobuild.gradle
do módulo do app, conforme como mostrado no exemplo a seguir:Groovy
dependencies { implementation 'com.google.android.gms:play-services-cronet:18.0.1' }
Kotlin
dependencies { implementation("com.google.android.gms:play-services-cronet:18.0.1") }
Objetos CronetEngine
criados uma vez que este
for adicionada usará a Cronet carregada do Google Play Services. Ligação
CronetProviderInstaller.installProvider(Context)
antes de criar objetos CronetEngine
para evitar exceções inesperadas
seja gerada durante a criação de CronetEngine
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 do Google Play Services,
uma implementação de menor desempenho da API da Cronet que pode ser usada. Para usar
essa implementação alternativa, dependam de org.chromium.net:cronet-fallback
e chame new JavaCronetProvider(context).createBuilder()
.
Criar uma solicitação de rede
Nesta seção, mostramos como criar e enviar uma solicitação de rede usando a Cronet Biblioteca. Depois de enviar a solicitação de rede, o app precisa processar a rede resposta.
Criar e configurar uma instância do CronetEngine
A biblioteca oferece
Classe CronetEngine.Builder
que pode ser usado para criar uma instância do
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();
É possível usar a classe Builder
para configurar um
objeto CronetEngine
, por exemplo,
oferecem 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 retorno de chamada, crie uma subclasse de
UrlRequest.Callback
e
implementar os métodos abstratos necessários, como 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 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.") } }
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 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."); } }
Criar um objeto Executor para gerenciar tarefas de rede
É possível usar a classe Executor
para executar
tarefas.
Para acessar uma instância de Executor
, use um dos
métodos estáticos da classe Executors
que retornam
um objeto Executor
. O exemplo abaixo mostra como criar um Executor
objeto 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()
da CronetEngine
passando o
URL de destino, uma instância da sua classe de callback e o objeto do executor.
O método newUrlRequestBuilder()
retorna uma
objeto UrlRequest.Builder
que
que você pode usar para criar o UrlRequest
, conforme 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();
Você pode usar a classe Builder
para
configure a instância de UrlRequest
. Para
é 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
Método start()
da solicitação:
Kotlin
request.start()
Java
request.start();
Seguindo as instruções nesta seção, você pode criar e enviar uma rede
solicitação usando a Cronet. No entanto, para simplificar, o exemplo
implementação de
Apenas fotos do UrlRequest.Callback
e enviar uma mensagem ao registro. A seção a seguir mostra como fornecer um callback
implementação compatível com cenários mais úteis, como a extração de dados
na 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 será iniciado. Seu app deve gerenciar o
durante o ciclo de vida especificando um callback. Para saber mais sobre o
da tabela, consulte Solicitação da Cronet
de desenvolvimento de software. É possível especificar
de retorno de chamada criando uma subclasse de
UrlRequest.Callback
e
os seguintes métodos:
onRedirectReceived()
Invocado quando o servidor emite um código de redirecionamento HTTP em resposta ao solicitação original. Para seguir o redirecionamento para o novo destino, use o
followRedirect()
. Caso contrário, usecancel()
. . 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
onResponseStarted()
é invocado somente depois que todos os redirecionamentos são 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 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 seguinte exemplo 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 O método
start()
foi chamado. A exemplo a seguir mostra como implementar o método e obter 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, não há outros métodos doUrlRequest.Callback
estão invocado. Use esse método 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. … }