Hier erfahren Sie, wie Sie mit der Cronet-Bibliothek Netzwerkvorgänge in Ihrer Android-App ausführen. Cronet ist der Chromium-Netzwerk-Stack, den Sie als Bibliothek in Ihren Apps verwenden können. Weitere Informationen zu den Bibliotheksfunktionen finden Sie unter Netzwerkvorgänge mit Cronet durchführen.
Bibliothek in Ihrem Projekt einrichten
So fügen Sie der Cronet-Bibliothek in Ihrem Projekt eine Abhängigkeit hinzu:
Prüfen Sie, ob Android Studio in der Datei
settings.gradle
Ihres Projekts einen Verweis auf das Maven-Repository von Google eingefügt hat, wie im folgenden Beispiel gezeigt:Groovig
dependencyResolutionManagement { ... repositories { ... google() } }
Kotlin
dependencyResolutionManagement { ... repositories { ... google() } }
Fügen Sie im Abschnitt
dependencies
der Dateibuild.gradle
Ihres App-Moduls einen Verweis auf die Google Play-Dienste-Clientbibliothek für Cronet ein, wie im folgenden Beispiel gezeigt:Groovig
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") }
CronetEngine
-Objekte, die nach dem Hinzufügen dieser Abhängigkeit erstellt wurden, verwenden Cronet, das aus Google Play-Diensten geladen wurde. Rufen Sie CronetProviderInstaller.installProvider(Context)
auf, bevor Sie CronetEngine
-Objekte erstellen, um zu verhindern, dass beim Erstellen von CronetEngine
unerwartete Ausnahmen aufgrund von Fehlern wie Geräten ausgelöst werden, die eine aktualisierte Version der Google Play-Dienste erfordern.
Falls Cronet nicht aus den Google Play-Diensten geladen werden kann, gibt es eine weniger leistungsfähige Implementierung der Cronet-API, die verwendet werden kann. Wenn Sie diese Fallback-Implementierung verwenden möchten, benötigen Sie org.chromium.net:cronet-fallback
und rufen new JavaCronetProvider(context).createBuilder()
auf.
Netzwerkanfrage erstellen
In diesem Abschnitt wird beschrieben, wie Sie mithilfe der Cronet-Bibliothek eine Netzwerkanfrage erstellen und senden. Nach dem Senden der Netzwerkanfrage sollte Ihre App die Netzwerkantwort verarbeiten.
CronetEngine-Instanz erstellen und konfigurieren
Die Bibliothek bietet eine CronetEngine.Builder
-Klasse, mit der Sie eine Instanz von CronetEngine
erstellen können. Das folgende Beispiel zeigt, wie ein CronetEngine
-Objekt erstellt wird:
Kotlin
val myBuilder = CronetEngine.Builder(context) val cronetEngine: CronetEngine = myBuilder.build()
Java
CronetEngine.Builder myBuilder = new CronetEngine.Builder(context); CronetEngine cronetEngine = myBuilder.build();
Mit der Klasse Builder
können Sie ein CronetEngine
-Objekt konfigurieren und beispielsweise Optionen wie Caching und Datenkomprimierung bereitstellen. Weitere Informationen findest du unter CronetEngine.Builder
.
Implementierung des Anfrage-Callbacks angeben
Um eine Implementierung des Callbacks bereitzustellen, musst du eine abgeleitete Klasse von UrlRequest.Callback
erstellen und die erforderlichen abstrakten Methoden implementieren, wie im folgenden Beispiel gezeigt:
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."); } }
Executor-Objekt zum Verwalten von Netzwerkaufgaben erstellen
Mit der Klasse Executor
können Sie Netzwerkaufgaben ausführen.
Um eine Instanz von Executor
abzurufen, verwenden Sie eine der statischen Methoden der Executors
-Klasse, die ein Executor
-Objekt zurückgeben. Das folgende Beispiel zeigt, wie Sie mit der Methode newSingleThreadExecutor()
ein Executor
-Objekt erstellen:
Kotlin
val executor: Executor = Executors.newSingleThreadExecutor()
Java
Executor executor = Executors.newSingleThreadExecutor();
UrlRequest-Objekt erstellen und konfigurieren
Rufen Sie zum Erstellen der Netzwerkanfrage die Methode newUrlRequestBuilder()
von CronetEngine
auf und übergeben Sie die Ziel-URL, eine Instanz Ihrer Callback-Klasse und das Executor-Objekt.
Die Methode newUrlRequestBuilder()
gibt ein Objekt UrlRequest.Builder
zurück, mit dem Sie das Objekt UrlRequest
erstellen können. Hier ein Beispiel:
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();
Sie können die Klasse Builder
verwenden, um die Instanz von UrlRequest
zu konfigurieren. Sie können beispielsweise eine Priorität oder das HTTP-Verb angeben. Weitere Informationen findest du unter UrlRequest.Builder
.
Rufen Sie die Methode start()
der Anfrage auf, um die Netzwerkaufgabe zu starten:
Kotlin
request.start()
Java
request.start();
Wenn Sie der Anleitung in diesem Abschnitt folgen, können Sie mit Cronet eine Netzwerkanfrage erstellen und senden. Der Einfachheit halber gibt die Beispielimplementierung von UrlRequest.Callback
jedoch nur eine Nachricht im Log aus. Im folgenden Abschnitt wird gezeigt, wie Sie eine Callback-Implementierung bereitstellen, die nützlichere Szenarien unterstützt, z. B. das Extrahieren von Daten aus der Antwort und das Erkennen eines Fehlers in der Anfrage.
Netzwerkantwort verarbeiten
Nach dem Aufrufen der Methode start()
wird der Lebenszyklus der Cronet-Anfrage initiiert. Die Anwendung sollte die Anfrage während des Lebenszyklus verwalten, indem sie einen Callback angibt. Weitere Informationen zum Lebenszyklus finden Sie unter Cronet-Anfragelebenszyklus. Sie können einen Callback angeben. Dazu erstellen Sie eine abgeleitete Klasse von UrlRequest.Callback
und implementieren die folgenden Methoden:
onRedirectReceived()
Wird aufgerufen, wenn der Server als Antwort auf die ursprüngliche Anfrage einen HTTP-Weiterleitungscode ausgibt. Verwenden Sie die Methode
followRedirect()
, um der Weiterleitung zum neuen Ziel zu folgen. Verwenden Sie andernfalls die Methodecancel()
. Das folgende Beispiel zeigt, wie die Methode implementiert wird: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()
Wird aufgerufen, wenn der endgültige Satz von Headern empfangen wird. Die Methode
onResponseStarted()
wird erst aufgerufen, wenn alle Weiterleitungen befolgt wurden. Der folgende Code zeigt eine Beispielimplementierung der Methode: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()
Wird immer dann aufgerufen, wenn ein Teil des Antworttexts gelesen wurde. Das folgende Codebeispiel zeigt, wie die Methode implementiert und der Antworttext extrahiert wird:
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()
Wird aufgerufen, wenn die Netzwerkanfrage erfolgreich abgeschlossen wurde. Das folgende Beispiel zeigt, wie die Methode implementiert wird:
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()
Wird aufgerufen, wenn die Anfrage nach dem Aufruf der Methode
start()
aus irgendeinem Grund fehlgeschlagen ist. Das folgende Beispiel zeigt, wie die Methode implementiert und Informationen zum Fehler abgerufen werden: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()
Wird aufgerufen, wenn die Anfrage mit der Methode
cancel()
abgebrochen wurde. Nach dem Aufruf werden keine anderen Methoden der KlasseUrlRequest.Callback
aufgerufen. Mit dieser Methode können Sie Ressourcen freigeben, die zur Verarbeitung einer Anfrage zugewiesen sind. Das folgende Beispiel zeigt, wie die Methode implementiert wird: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. … }