Eseguire la migrazione al client GoogleApi

La release 11.2.0 dell'SDK Google Play Services include un nuovo modo per accedere all'SDK Places per Android. Il client GoogleApi è più facile da usare rispetto al suo predecessore (GoogleApiClient), poiché gestisce automaticamente le connessioni ai servizi Google Play. In questo modo riduci la quantità di codice boilerplate nella tua app e puoi contribuire a eliminare molti problemi comuni. La nuova API offre una serie di miglioramenti:

  • La procedura di connessione viene gestita automaticamente, quindi la nuova API richiede meno lavoro per l'implementazione.
  • Le chiamate API ora aspettano automaticamente che venga stabilita la connessione al servizio, eliminando la necessità di attendere onConnected prima di effettuare richieste.
  • L'API Tasks semplifica la composizione delle operazioni asincrone.
  • Il codice è autonomo e può essere spostato in un classe di utilità condivisa o simile.

L'aggiornamento dell'app per l'utilizzo del client GoogleApi richiede alcune modifiche all'implementazione di SDK di Places per Android. Questa guida descrive le modifiche apportate all'SDK Places per Android e consiglia i passaggi da seguire per aggiornare l'app in modo da utilizzare il nuovo client.

Panoramica

Le principali aree di cambiamento sono le seguenti:

  • Esistono due nuovi punti di contatto: GeoDataClient e PlaceDetectionClient. Invece di creare un'istanza di GoogleApiClient per coprire tutte le API, ora la tua app deve creare istanze sia di GoogleApiClient sia di PlaceDetectionClient.GeoDataClient
  • Poiché i callback di connessione non sono più richiesti, puoi eseguire il refactoring della tua app in modo sicuro per rimuoverli.
  • I nuovi metodi dell'API Places sono ora asincroni e restituiscono un Task anziché un PendingResult.

Carica l'API Places

Per caricare l'API Places, dichiara i punti di accesso, quindi crea istanze dei client nel metodo onCreate() del frammento o dell'attività come mostrato nell'esempio seguente:

// 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);

Confronto

I nuovi metodi dell'API Places sono ora asincroni e restituiscono un Task anziché un PendingResult. Le strutture di dati non sono cambiate, pertanto il codice esistente per la gestione dei risultati non dovrebbe richiedere aggiornamenti. I seguenti esempi di codice confrontano le versioni nuove e precedenti di GetCurrentPlace():

Il nuovo modo

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();
    }
});

Il vecchio metodo

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();
  }
});

Scopri di più

Scopri di più sull'accesso alle API di Google.