Como migrar para o cliente GoogleApi

A versão 11.2.0 do SDK do Google Play Services inclui uma nova maneira de acessar o SDK do Places para Android. O cliente GoogleApi é mais fácil de usar do que o predecessor (GoogleApiClient), porque gerencia automaticamente as conexões com o Google Play Services. Isso reduz a quantidade de código boilerplate no app e pode ajudar a eliminar muitos problemas comuns. A nova API oferece várias melhorias:

  • O processo de conexão é gerenciado automaticamente, o que facilita a implementação da nova API.
  • As chamadas de API agora aguardam automaticamente até que a conexão do serviço seja estabelecida, eliminando a necessidade de esperar onConnected antes de fazer solicitações.
  • A API Tasks facilita a criação de operações assíncronas.
  • O código é independente e pode ser facilmente movido para uma classe de utilitário compartilhada ou semelhante.

A atualização do seu app para usar o cliente GoogleApi requer algumas mudanças na implementação do SDK do Places para Android. Este guia descreve as mudanças nesse SDK e recomenda as etapas a serem seguidas ao atualizar o app para usar o novo cliente.

Visão geral

As principais áreas de mudança são as seguintes:

  • Há dois novos pontos de entrada: GeoDataClient e PlaceDetectionClient. Em vez de criar uma instância de GoogleApiClient para abranger todas as APIs, o app precisa instanciar GeoDataClient e PlaceDetectionClient.
  • Como os callbacks de conexão não são mais necessários, você pode refatorar seu app com segurança para removê-los.
  • Os novos métodos da API Places agora são assíncronos e retornam um Task em vez de um PendingResult.

Carregar a API Places

Para carregar a API Places, declare os pontos de entrada e instancie os clientes no método onCreate() do fragmento ou da atividade, como mostrado no exemplo a seguir:

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

Comparação

Os novos métodos da API Places agora são assíncronos e retornam um Task em vez de um PendingResult. As estruturas de dados não foram alteradas. Portanto, o código atual para lidar com os resultados não precisa ser atualizado. Os exemplos de código abaixo comparam as versões nova e antiga do GetCurrentPlace():

A nova maneira

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

O jeito antigo

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

Saiba mais

Saiba mais sobre como acessar as APIs do Google.