Wyślij prostą prośbę

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:

  1. 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()
       }
    }
    
  2. Dodaj odwołanie do biblioteki klienta usług Google Play dla aplikacji Cronet w sekcji dependencies pliku build.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ędzia cancel() . 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 metody UrlRequest.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.
  …
}