Migracja do klienta Google API

Pakiet SDK Usług Google Play w wersji 11.2.0 zapewnia nowy sposób dostępu do pakietu Places SDK 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 w aplikacji i pomaga wyeliminować wiele najczęstszych błędów. Nowy interfejs API ma szereg ulepszeń:

  • Proces łączenia jest zarządzany automatycznie, więc wdrożenie nowego interfejsu API zajmuje mniej czasu.
  • Wywołania interfejsu API teraz automatycznie czekają na nawiązanie połączenia z usługą, dzięki czemu nie trzeba czekać na onConnected przed wysłaniem żądań.
  • Interfejs Tasks API ułatwia tworzenie operacji asynchronicznych.
  • Kod jest samodzielny i można go łatwo przenieść do udostępnionej klasy narzędzia lub podobnego.

Aby korzystać z klienta GoogleApi, trzeba wprowadzić pewne zmiany w implementacji pakietu SDK Miejsc na Androida. W tym przewodniku opisujemy zmiany w pakiecie Miejsca SDK na Androida oraz podpowiadamy, co zrobić przy aktualizowaniu aplikacji, by używała nowego klienta.

Przegląd

Oto główne obszary zmian:

  • Występują 2 nowe punkty wejścia: GeoDataClient i PlaceDetectionClient. Zamiast tworzyć 1 instancję GoogleApiClient do obsługi wszystkich interfejsów API, Twoja aplikacja musi teraz tworzyć wystąpienia zarówno GeoDataClient, jak i PlaceDetectionClient.
  • Ponieważ wywołania zwrotne połączenia nie są już wymagane, możesz bezpiecznie refaktoryzować aplikację, aby je usunąć.
  • Nowe metody interfejsu Places API są teraz asynchroniczne i zwracają metodę Task zamiast PendingResult.

Wczytywanie interfejsu Places API

Aby wczytać interfejs Places API, zadeklaruj punkty wejścia, a następnie utwórz instancję klientów w metodzie onCreate() fragmentu lub działania, jak 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ą metodę Task zamiast PendingResult. Struktury danych nie uległy zmianie, więc obecny kod do obsługi wyników nie powinien wymagać aktualizacji. Poniższe przykłady kodu porównują nową i starą wersję 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 dostępie do interfejsów API Google.