GoogleApi 클라이언트로 이전

Google Play 서비스 SDK 11.2.0 버전에는 Android용 Places SDK에 액세스하는 새로운 방법이 포함되어 있습니다. GoogleApi 클라이언트는 Google Play 서비스 연결을 자동으로 관리하므로 이전 버전 (GoogleApiClient)보다 사용하기가 쉽습니다. 이렇게 하면 앱의 상용구 코드의 양이 줄어들고 여러 일반적인 문제를 해결하는 데 도움이 될 수 있습니다. 새 API는 다음과 같이 여러 가지 향상된 기능을 제공합니다.

  • 연결 프로세스가 자동으로 관리되므로 새 API를 구현하는 작업이 줄어듭니다.
  • 이제 API 호출은 서비스 연결이 설정될 때까지 자동으로 기다리므로 요청하기 전에 onConnected를 기다릴 필요가 없습니다.
  • Tasks API를 사용하면 비동기 작업을 더 쉽게 작성할 수 있습니다.
  • 코드는 독립적이며 공유 유틸리티 클래스 등으로 쉽게 이동할 수 있습니다.

GoogleApi 클라이언트를 사용하도록 앱을 업데이트하려면 Android용 Places SDK 구현을 일부 변경해야 합니다. 이 가이드에서는 Android용 Places SDK의 변경사항을 설명하고 새 클라이언트를 사용하도록 앱을 업데이트할 때 취해야 할 조치를 권장합니다.

개요

주요 변경 영역은 다음과 같습니다.

  • 새로운 진입점은 GeoDataClientPlaceDetectionClient입니다. 모든 API를 포함하는 하나의 GoogleApiClient 인스턴스를 만드는 대신 이제 앱은 GeoDataClientPlaceDetectionClient를 모두 인스턴스화해야 합니다.
  • 연결 콜백이 더 이상 필요하지 않으므로 안전하게 앱을 리팩터링하여 콜백을 삭제할 수 있습니다.
  • 새로운 Places API 메서드는 이제 비동기식이며 PendingResult 대신 Task를 반환합니다.

Places API 로드

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

비교

새로운 Places API 메서드는 이제 비동기식이며 PendingResult 대신 Task를 반환합니다. 데이터 구조는 변경되지 않았으므로 결과 처리를 위한 기존 코드를 업데이트할 필요가 없습니다. 다음 코드 예는 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();
  }
});

자세히 알아보기

Google API 액세스에 대해 자세히 알아보기