Migracja na klienta GoogleApi

Wersja 11.2.0 pakietu SDK Usług Google Play zawiera nowy sposób uzyskiwania dostępu do pakietu SDK Miejsc Google na Androida. Klient GoogleApi jest łatwiejszy w użyciu niż jego poprzednik (GoogleApiClient), ponieważ automatycznie zarządza połączeniami z usługami Google Play. Zmniejsza to ilość kodu standardowego w aplikacji i może pomóc uniknąć wielu typowych problemów. Nowy interfejs API ma kilka ulepszeń:

  • Proces łączenia jest zarządzany automatycznie, więc wdrożenie nowego interfejsu API wymaga mniej pracy.
  • Wywołania API automatycznie czekają teraz na nawiązanie połączenia z usługą, co eliminuje konieczność oczekiwania na onConnected przed wysłaniem żądań.
  • Interfejs Tasks API ułatwia tworzenie operacji asynchronicznych.
  • Kod jest samodzielny i można go przenieść do udostępnionej klasy narzędziowej lub podobnej.

Aktualizacja aplikacji, aby korzystała z GoogleApi, wymaga wprowadzenia pewnych zmian w implementacji pakietu SDK Miejsc Google na Androida. Ten przewodnik opisuje zmiany w pakiecie Places SDK na Androida i zawiera zalecenia dotyczące aktualizacji aplikacji, aby korzystała z nowego klienta.

Przegląd

Główne obszary zmian to:

  • Dostępne są 2 nowe punkty wejścia: GeoDataClientPlaceDetectionClient. Zamiast tworzyć 1 instancję GoogleApiClient obejmującą wszystkie interfejsy API, aplikacja musi teraz tworzyć instancje GeoDataClientPlaceDetectionClient.
  • Wywołania zwrotne połączenia nie są już wymagane, więc możesz bezpiecznie zmodyfikować aplikację, aby je usunąć.
  • Nowe metody interfejsu Places API są teraz asynchroniczne i zwracają wartość Task zamiast PendingResult.

Wczytywanie interfejsu Places API

Aby wczytać interfejs Places API, zadeklaruj punkty wejścia, a następnie utwórz instancje klientów w metodzie onCreate() fragmentu lub aktywności, jak pokazano w tym przykładzie:

// The entry points to the Places API.
private GeoDataClient mGeoDataClient;
private PlaceDetectionClient mPlaceDetectionClient;

...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Construct a GeoDataClient.
    mGeoDataClient = Places.getGeoDataClient(this, null);

    // Construct a PlaceDetectionClient.
    mPlaceDetectionClient = Places.getPlaceDetectionClient(this, null);

Porównanie

Nowe metody interfejsu Places API są teraz asynchroniczne i zwracają wartość Task zamiast PendingResult. Struktury danych nie uległy zmianie, więc istniejący kod do obsługi wyników nie powinien wymagać aktualizacji. Poniższe przykłady kodu porównują nowe i wcześniejsze wersje GetCurrentPlace():

Nowy sposób

Task<PlaceLikelihoodBufferResponse> placeResult = mPlaceDetectionClient.getCurrentPlace(null);
placeResult.addOnCompleteListener(new OnCompleteListener<PlaceLikelihoodBufferResponse>() {
    @Override
    public void onComplete(@NonNull Task<PlaceLikelihoodBufferResponse> task) {
        PlaceLikelihoodBufferResponse likelyPlaces = task.getResult();
        for (PlaceLikelihood placeLikelihood : likelyPlaces) {
            Log.i(TAG, String.format("Place '%s' has likelihood: %g",
                placeLikelihood.getPlace().getName(),
                placeLikelihood.getLikelihood()));
        }
        likelyPlaces.release();
    }
});

Stary sposób

PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
    .getCurrentPlace(mGoogleApiClient, null);
result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
  @Override
  public void onResult(PlaceLikelihoodBuffer likelyPlaces) {
    for (PlaceLikelihood placeLikelihood : likelyPlaces) {
      Log.i(TAG, String.format("Place '%s' has likelihood: %g",
          placeLikelihood.getPlace().getName(),
          placeLikelihood.getLikelihood()));
    }
    likelyPlaces.release();
  }
});

Więcej informacji

Dowiedz się więcej o uzyskiwaniu dostępu do interfejsów API Google.