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 bao gồm một cách mới để truy cập vào SDK Địa điểm dành cho Android. Ứng dụng GoogleApi dễ sử dụng hơn so với phiên bản trước (GoogleApiClient) vì ứng dụng này tự động quản lý các kết nối với Dịch vụ Google Play. Điều này làm giảm số lượng mã nguyên mẫu trong ứng dụng và có thể giúp loại bỏ nhiều lỗi phổ biến. API mới có một số điểm cải tiến:

  • Quá trình kết nối được quản lý tự động nên API mới ít phải tốn nhiều công sức triển khai hơn.
  • Các lệnh gọi API hiện sẽ tự động chờ 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.
  • API Tasks giúp bạn dễ dàng soạn các thao tác không đồng bộ.
  • Mã này độc lập và có thể dễ dàng di chuyển vào lớp tiện ích dùng chung hoặc lớp tương tự.

Việc cập nhật ứng dụng để sử dụng ứng dụng GoogleApi yêu cầu một số thay đổi đối với cách triển khai SDK Địa điểm dành cho Android. Hướng dẫn này mô tả các thay đổi đối với SDK Địa điểm dành cho Android, đồng thời đề xuất các bước nên thực hiện khi cập nhật ứng dụng để dùng ứng dụng mới.

Tổng quan

Sau đây là các khía cạnh thay đổi chính:

  • Có hai đ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 phải tạo thực thể cho cả GeoDataClientPlaceDetectionClient.
  • Vì các lệnh gọi lại kết nối không còn cần thiết 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 đó.
  • Các phương thức mới của Places API 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 khách trong phương thức onCreate() của mảnh hoặc hoạt động của bạn 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 mới của Places API 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 mã ví dụ sau đây so sánh phiên bản mới và phiên bản cũ của GetCurrentPlace():

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

Lối 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 API của Google.