Google Play 服务 SDK 的 11.2.0 版本包含一种访问 Places SDK for Android 的新方式。The GoogleApi 客户端比其前身 (GoogleApiClient) 更易于使用,因为它会自动管理与 Google Play 服务 的连接。这减少了应用中的样板代码量,并有助于消除许多常见陷阱。新 API 提供了多项改进:
- 连接过程由系统自动管理,因此实现新 API 的工作量较小。
- API 调用现在会自动等待服务连接建立,因此无需在发出请求之前等待
onConnected。 - Tasks API 可帮助您更轻松地编写 异步操作。
- 代码是自包含的,可以移到共享实用程序类或类似类中。
如需更新应用以使用 GoogleApi 客户端,您需要对 Places SDK for Android
实现进行一些更改。本指南介绍了 Places SDK for Android 的更改,并建议您在更新应用以使用新客户端时采取的步骤。
概览
主要变更领域如下:
- 有两个新入口点:
GeoDataClient和PlaceDetectionClient。 您的应用现在必须同时实例化GeoDataClient和PlaceDetectionClient,而不是创建一个GoogleApiClient实例来涵盖所有 API。 - 由于不再需要连接回调,因此您可以安全地重构应用以移除它们。
- 新的 Places API 方法现在是异步的,并且会返回
Task而不是PendingResult。
加载 Places API
如需加载 Places API,请声明入口点 ,然后在 Fragment 或 Activity 的 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。