Переход на клиент GoogleApi

В версии 11.2.0 SDK сервисов Google Play появился новый способ доступа к SDK Places для Android. Клиент GoogleApi проще в использовании, чем его предшественник ( GoogleApiClient ), поскольку он автоматически управляет подключениями к сервисам Google Play. Это уменьшает количество шаблонного кода в вашем приложении и может помочь избежать многих распространенных ошибок. Новый API предлагает ряд улучшений:

  • Процесс подключения осуществляется автоматически, поэтому внедрение нового API требует меньше усилий.
  • Теперь вызовы API автоматически ожидают установления соединения со службой, что устраняет необходимость ждать события onConnected перед отправкой запросов.
  • API задач упрощает компоновку асинхронных операций.
  • Код является самодостаточным и может быть вынесен в общий вспомогательный класс или аналогичный.

Для обновления вашего приложения с использованием клиента GoogleApi потребуется внести некоторые изменения в реализацию Places SDK для Android. В этом руководстве описаны изменения в Places SDK для Android и рекомендованы шаги, которые необходимо предпринять при обновлении вашего приложения для использования нового клиента.

Обзор

Основные области изменений следующие:

  • Появились две новые точки входа: GeoDataClient и PlaceDetectionClient . Вместо создания одного экземпляра GoogleApiClient для всех API, ваше приложение теперь должно создать экземпляры как GeoDataClient , так и PlaceDetectionClient .
  • Поскольку обратные вызовы для установления соединения больше не требуются, вы можете смело переписать свое приложение, удалив их.
  • Новые методы API Places теперь асинхронны и возвращают Task , а не PendingResult .

Загрузите API Places.

Для загрузки Places API объявите точки входа, а затем создайте экземпляры клиентов в методе onCreate() вашего фрагмента или активности, как показано в следующем примере:

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

Сравнение

Новые методы API Places теперь асинхронны и возвращают Task , а не PendingResult . Структуры данных не изменились, поэтому ваш существующий код для обработки результатов не должен нуждаться в обновлении. Следующие примеры кода сравнивают новую и более ранние версии метода GetCurrentPlace() :

Новый способ

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

старый способ

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

Узнать больше

Узнайте больше о доступе к API Google .