Di chuyển sang Ứng dụng GoogleApi

Bản phát hành 11.2.0 của SDK Dịch vụ Google Play có một cách mới để truy cập vào Places SDK cho Android. Ứng dụng GoogleApi dễ sử dụng hơn so với ứng dụng tiền nhiệm (GoogleApiClient), vì ứng dụng này tự động quản lý các kết nối đến Dịch vụ Google Play. Điều này giúp giảm lượng mã nguyên mẫu trong ứng dụng của bạn và có thể giúp loại bỏ nhiều lỗi thường gặp. API mới có một số điểm cải tiến:

  • Quy trình kết nối được quản lý tự động, vì vậy, API mới sẽ giúp bạn giảm bớt công sức triển khai.
  • Giờ đây, các lệnh gọi API sẽ tự động đợi thiết lập kết nối dịch vụ, giúp bạn không cần phải đợi onConnected trước khi đưa ra yêu cầu.
  • Tasks API giúp bạn dễ dàng tạo các thao tác không đồng bộ.
  • Mã này độc lập và có thể được chuyển vào một lớp tiện ích dùng chung hoặc tương tự.

Việc cập nhật ứng dụng để sử dụng ứng dụng GoogleApi đòi hỏi bạn phải thực hiện một số thay đổi đối với việc triển khai Places SDK for Android. Hướng dẫn này mô tả những thay đổi đối với Places SDK cho Android và đề xuất các bước cần thực hiện khi cập nhật ứng dụng để sử dụng ứng dụng mới.

Tổng quan

Sau đây là những thay đổi chính:

  • Có 2 điểm truy cập mới: GeoDataClientPlaceDetectionClient. Thay vì tạo một thực thể GoogleApiClient để bao gồm tất cả các API, giờ đây, ứng dụng của bạn phải khởi tạo cả GeoDataClientPlaceDetectionClient.
  • Vì không còn cần đến các lệnh gọi lại kết nối nữa, nên bạn có thể tái cấu trúc ứng dụng một cách an toàn để xoá các lệnh gọi lại này.
  • Các phương thức Places API mới hiện không đồng bộ và trả về Task thay vì PendingResult.

Tải Places API

Để tải Places API, hãy khai báo các điểm truy cập, sau đó tạo thực thể cho các ứng dụng trong phương thức onCreate() của phân đoạn hoặc hoạt động như minh hoạ trong ví dụ sau:

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

Phép so sánh

Các phương thức Places API mới hiện không đồng bộ và trả về Task thay vì PendingResult. Cấu trúc dữ liệu không thay đổi, vì vậy, bạn không cần cập nhật mã hiện có để xử lý kết quả. Các ví dụ về mã sau đây so sánh phiên bản mới và phiên bản trước của GetCurrentPlace():

Cách thức mới

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

Cách cũ

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

Tìm hiểu thêm

Tìm hiểu thêm về cách truy cập vào các API của Google.