Wyślij prostą prośbę

Dowiedz się, jak korzystać z biblioteki Cronet do wykonywania operacji sieciowych w aplikacji na Androida. Cronet to stos sieciowy Chromium dostępny jako biblioteka, której możesz używać w swoich aplikacjach. Więcej informacji o funkcjach biblioteki znajdziesz w artykule o wykonywaniu operacji sieciowych za pomocą aplikacji Cronet.

Konfigurowanie biblioteki w projekcie

Aby dodać zależność do biblioteki Cronet w projekcie, wykonaj te czynności:

  1. Sprawdź, czy Android Studio zawierał odwołanie do repozytorium Google Maven w pliku settings.gradle projektu, jak w tym przykładzie:

    Odlotowy

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    
  2. Dodaj odniesienie do biblioteki klienta Usług Google Play dla Cronet w sekcji dependencies pliku build.gradle modułu aplikacji, jak pokazano w tym przykładzie:

    Odlotowy

    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 obiekty utworzone po dodaniu tej zależności będą korzystać z aplikacji Cronet ładowanej z Usług Google Play. Wywołaj metodę CronetProviderInstaller.installProvider(Context) przed utworzeniem obiektów CronetEngine, aby zapobiec pojawianiu się nieoczekiwanych wyjątków podczas tworzenia elementu CronetEngine z powodu błędów takich jak urządzenia wymagające zaktualizowanej wersji Usług Google Play.

W przypadkach, gdy nie można ładować Cronet z Usług Google Play, można użyć mniej wydajnej implementacji interfejsu API Cronet. Aby użyć tej implementacji zastępczej, skorzystaj z metody org.chromium.net:cronet-fallback i wywołania new JavaCronetProvider(context).createBuilder().

Utwórz żądanie sieciowe

W tej sekcji dowiesz się, jak utworzyć i wysłać żądanie sieciowe za pomocą biblioteki Cronet. Po wysłaniu żądania sieciowego aplikacja powinna przetworzyć odpowiedź sieci.

Tworzenie i konfigurowanie instancji CronetEngine

Biblioteka udostępnia klasę CronetEngine.Builder, której możesz użyć do utworzenia instancji CronetEngine. Poniższy przykład 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ć obiekt CronetEngine. Możesz na przykład udostępniać opcje takie 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 zaimplementuj wymagane metody abstrakcyjne, 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 wykonawcy do zarządzania zadaniami sieciowymi

Klasy Executor możesz używać do wykonywania zadań sieciowych. Aby pobrać instancję Executor, użyj jednej ze statycznych metod klasy Executors, która zwraca obiekt Executor. Poniższy przykład pokazuje, jak utworzyć obiekt Executor przy użyciu metody 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() obiektu CronetEngine, przekazując docelowy adres URL, instancję klasy wywołania zwrotnego i obiekt wykonawcy. Metoda newUrlRequestBuilder() zwraca obiekt UrlRequest.Builder, którego możesz użyć do utworzenia obiektu 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();

Do skonfigurowania instancji UrlRequest możesz użyć klasy Builder. Możesz na przykład określić priorytet lub czasownik HTTP. Więcej informacji: UrlRequest.Builder.

Aby uruchomić zadanie sieciowe, wywołaj w żądaniu metodę start():

Kotlin

request.start()

Java

request.start();

Postępując zgodnie z instrukcjami w tej sekcji, możesz utworzyć i wysłać żądanie sieci za pomocą Cronet. Jednak dla uproszczenia przykładowa implementacja UrlRequest.Callback powoduje wyświetlenie w logu tylko komunikatu. W sekcji poniżej pokazujemy, jak udostępnić implementację wywołania zwrotnego, która obsługuje bardziej przydatne scenariusze, takie jak wyodrębnianie danych z odpowiedzi i wykrywanie błędu w żądaniu.

Przetwarzanie odpowiedzi sieci

Po wywołaniu metody start() rozpoczyna się cykl życia żądania Cronet. Aplikacja powinna zarządzać żądaniem w trakcie cyklu życia, określając wywołanie zwrotne. Więcej informacji o cyklu życia znajdziesz w artykule Cykl życia żądania w Cronet. Możesz określić wywołanie zwrotne, tworząc podklasę UrlRequest.Callback i implementując te metody:

onRedirectReceived()

Wywoływana, gdy w odpowiedzi na pierwotne żądanie serwer wysyła kod przekierowania HTTP. Aby zastosować przekierowanie do nowego miejsca docelowego, użyj metody followRedirect(). W przeciwnym razie użyj metody cancel(). Z przykładu poniżej dowiesz się, jak wdrożyć tę 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 końcowego zestawu nagłówków. Metoda onResponseStarted() jest wywoływana dopiero po przestrzeganiu wszystkich przekierowań. Poniżej znajduje się kod przykładowej implementacji 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 po odczytaniu części treści odpowiedzi. Poniższy przykładowy 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ływane po pomyślnym ukończeniu żądania sieciowego. Poniższy przykład pokazuje, jak wdrożyć tę 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 wywołaniu metody start(). Poniższy przykład pokazuje, jak wdrożyć metodę i uzyskać informacje o błędzie:

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ływane, jeśli żądanie zostało anulowane przy użyciu metody cancel(). Po wywołaniu żadne inne metody klasy UrlRequest.Callback nie są wywoływane. Za pomocą tej metody możesz zwolnić zasoby przydzielone do przetworzenia żądania. Z przykładu poniżej dowiesz się, jak wdrożyć tę 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.
  …
}