Google Play 服務 SDK 11.2.0 版提供存取 Places SDK for Android 的新方式。GoogleApi 用戶端比前身 (GoogleApiClient) 更容易使用,因為它會自動管理與 Google Play 服務的連線。這可減少應用程式中的樣板程式碼數量,並有助於避免許多常見的陷阱。新版 API 改善了以下幾個項目:
- 連線程序會自動管理,因此實作新版 API 的工作量較少。
- API 呼叫現在會自動等待服務連線建立,因此不必等待
onConnected,即可提出要求。 - Tasks API 可簡化非同步作業的組合程序。
- 程式碼是獨立的,可以移至共用的公用程式類別或類似項目。
如要更新應用程式以使用 GoogleApi 用戶端,您必須對 Places SDK for Android 實作項目進行一些變更。本指南說明 Android 適用的 Places SDK 變更內容,並建議更新應用程式以使用新版用戶端時應採取的步驟。
總覽
主要異動如下:
- 有兩個新進入點:
GeoDataClient和PlaceDetectionClient。 現在應用程式必須同時例項化GeoDataClient和PlaceDetectionClient,而不是建立一個GoogleApiClient例項來涵蓋所有 API。 - 由於不再需要連線回呼,您可以安全地重構應用程式,移除這些回呼。
- 新的 Places API 方法現在為非同步,並會傳回
Task,而非PendingResult。
載入 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 方法現在為非同步,並會傳回 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(); } });
瞭解詳情
進一步瞭解如何存取 Google API。