Dowiedz się, jak używać biblioteki Cronet do wykonywania operacji sieciowych Aplikacja na Androida. Cronet to stos sieci Chromium dostępny jako biblioteka do wykorzystania w aplikacjach. Więcej informacji o funkcjach biblioteki Więcej informacji znajdziesz w sekcji Wykonywanie operacji sieciowych za pomocą ).
Konfigurowanie biblioteki w projekcie
Aby dodać zależność do biblioteki Cronet w projekcie, wykonaj te czynności:
Sprawdź, czy Android Studio zawiera odwołanie do repozytorium Google Maven w pliku
settings.gradle
projektu, jak widać w tym przykładzie przykład:Odlotowe
dependencyResolutionManagement { ... repositories { ... google() } }
Kotlin
dependencyResolutionManagement { ... repositories { ... google() } }
Dodaj odwołanie do biblioteki klienta usług Google Play dla aplikacji Cronet w sekcji
dependencies
plikubuild.gradle
modułu aplikacji, jak w tym przykładzie:Odlotowe
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") }
Liczba utworzonych wcześniej obiektów: CronetEngine
dodana zależność spowoduje użycie Cronet załadowanego z Usług Google Play. Zadzwoń do nas
CronetProviderInstaller.installProvider(Context)
przed utworzeniem obiektów CronetEngine
, aby zapobiec nieoczekiwanym wyjątkom
przed zgłoszeniem podczas tworzenia elementu CronetEngine
z powodu błędów takich jak urządzenia
wymagają zaktualizowanej wersji Usług Google Play.
Jeśli Cronet nie może zostać wczytany z Usług Google Play,
mniej wydajną implementację interfejsu API Cronet, którego można użyć. Aby użyć funkcji
tę implementację zastępczą, zależną od parametru org.chromium.net:cronet-fallback
i zadzwoń pod numer new JavaCronetProvider(context).createBuilder()
.
Utwórz żądanie sieciowe
Ta sekcja pokazuje, jak utworzyć i wysłać żądanie sieciowe za pomocą Cronet Biblioteka. Po wysłaniu żądania sieciowego aplikacja powinna przetworzyć sieć .
Tworzenie i konfigurowanie instancji CronetEngine
Biblioteka oferuje
CronetEngine.Builder
zajęcia
którego możesz użyć do utworzenia instancji
CronetEngine
Przykład poniżej
pokazuje, jak utworzyć obiekt CronetEngine
:
Kotlin
val myBuilder = CronetEngine.Builder(context) val cronetEngine: CronetEngine = myBuilder.build()
Java
CronetEngine.Builder myBuilder = new CronetEngine.Builder(context); CronetEngine cronetEngine = myBuilder.build();
Za pomocą klasy Builder
możesz skonfigurować
CronetEngine
, możesz na przykład
pozwalają na korzystanie z takich opcji jak buforowanie i kompresja danych. Więcej informacji:
CronetEngine.Builder
Udostępnij implementację wywołania zwrotnego żądania
Aby udostępnić implementację wywołania zwrotnego, utwórz podklasę
UrlRequest.Callback
i
wdrożysz wymagane metody abstrakcyjne, tak jak w tym przykładzie:
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."); } }
Tworzenie obiektu Executor do zarządzania zadaniami sieciowymi
Do wykonywania sieci możesz użyć klasy Executor
zadania.
Aby uzyskać instancję Executor
, użyj jednej z
metody statyczne klasy Executors
, które zwracają
obiekt Executor
. Poniższy przykład pokazuje, jak utworzyć Executor
za pomocą interfejsu newSingleThreadExecutor()
:
Kotlin
val executor: Executor = Executors.newSingleThreadExecutor()
Java
Executor executor = Executors.newSingleThreadExecutor();
Tworzenie i konfigurowanie obiektu UrlRequest
Aby utworzyć żądanie sieciowe, wywołaj metodę
newUrlRequestBuilder()
metoda CronetEngine
przekazująca
docelowy URL, instancję klasy wywołania zwrotnego i obiekt wykonawcy.
Metoda newUrlRequestBuilder()
zwraca błąd
UrlRequest.Builder
obiekt, który
których możesz użyć do utworzenia UrlRequest
Jak w tym przykładzie:
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();
Możesz użyć klasy Builder
do:
skonfigurować instancję UrlRequest
. Dla:
możesz na przykład określić priorytet lub czasownik HTTP. Więcej informacji:
UrlRequest.Builder
Aby rozpocząć zadanie sieciowe, wywołaj funkcję
Metoda start()
żądania:
Kotlin
request.start()
Java
request.start();
Postępując zgodnie z instrukcjami w tej sekcji, możesz utworzyć i wysłać sieć
za pomocą Cronet. Dla uproszczenia przykład
implementacja
Tylko odbitki UrlRequest.Callback
wiadomość do dziennika. W sekcji poniżej dowiesz się, jak dodać wywołanie zwrotne
która obsługuje bardziej przydatne scenariusze, takie jak wyodrębnianie danych z
odpowiedź i wykrycie błędu w żądaniu.
Przetwarzanie odpowiedzi sieci
Po wywołaniu start()
, inicjowany jest cykl życia żądania Cronet. Aplikacja powinna zarządzać
żądania w trakcie cyklu życia, określając wywołanie zwrotne. Aby dowiedzieć się więcej na temat:
Cykl życia, patrz Żądanie aplikacji Cronet
cyklu życia usługi. Jako
wywołanie zwrotne przez utworzenie podklasy
UrlRequest.Callback
i
implementując następujące metody:
onRedirectReceived()
Wywoływana, gdy serwer wysyła kod przekierowania HTTP w odpowiedzi na żądanie pierwotny wniosek. Aby przejść do nowego miejsca docelowego, użyj instrukcji
followRedirect()
. W przeciwnym razie skorzystaj z narzędziacancel()
. Poniższy przykład pokazuje, jak wdrożyć metodę: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()
Wywoływana po otrzymaniu ostatecznego zestawu nagłówków.
onResponseStarted()
jest wywoływana dopiero po śledzeniu wszystkich przekierowań. Następujący kod: pokazuje przykładową implementację metody: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()
Wywoływana za każdym razem, gdy została odczytana część treści odpowiedzi. Następujący kod: pokazuje, jak wdrożyć metodę i wyodrębnić treść odpowiedzi:
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()
Wywoływana po pomyślnym zakończeniu żądania sieciowego. Poniżej pokazuje, jak wdrożyć metodę:
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()
Wywoływana, jeśli żądanie nie powiodło się z jakiegokolwiek powodu po Została wywołana metoda
start()
. ten przykład pokazuje, jak wdrożyć metodę i uzyskać informacje o błąd: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()
Wywoływana, jeśli żądanie zostało anulowane za pomocą
cancel()
. Po wywołaniu nie inne metodyUrlRequest.Callback
zajęcia to . Za pomocą tej metody możesz zwolnić zasoby przydzielone do przetwarzania użytkownika. Poniższy przykład pokazuje, jak wdrożyć metodę: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. … }