我有一个用于创建包含GoogleApiClient的Geofences的课程,该课程目前由两个活动访问(由this tutorial创建)。我把这个类设置为非UI片段,因为据我所知(如果我错了,请纠正我!)GoogleApiClient需要附加到生命周期,并且能够连接多个地点我无法将其嵌入到活动中。
在活动中,我创建片段;
private GeofenceUtilityFragment geofenceUtils = new GeofenceUtilityFragment();
并将其添加到活动中;
if (savedInstanceState == null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().add(geofenceUtils, getString(R.string.fragment_key_geofence_utils)).commit();
}
当用户首次导航到活动时,一切都有效。但是,当应用程序被旋转时(或者可能导致重绘的任何其他事件),GoogleApiClient会返回一个空对象引用。
方法调用;
private void setGeofences(){
if (!mGoogleApiClient.isConnected()){
Toast.makeText(activityContext, "not connected", Toast.LENGTH_SHORT).show();
return;
}
但令人困惑的是,在旋转之后,onConnected回调会触发,因此API客户端正在重新连接,但出于某种原因,当我尝试访问它时,我得到一个null。
这里有Log语句显示两个(中间切出一些额外的绒毛)
0387/com.example.android.bentheredonethat D/GeofenceUtilityFragment: onConnected has just been called
[...]
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.google.android.gms.common.api.GoogleApiClient.isConnected()' on a null object reference
at geolocationtools.GeofenceUtilityFragment.setGeofences(GeofenceUtilityFragment.java:179)
at geolocationtools.GeofenceUtilityFragment.callGeofenceRoutine(GeofenceUtilityFragment.java:220)
at com.example.android.bentheredonethat.RouteDetailsActivity.startRouteButtonHandler(RouteDetailsActivity.java:321)
非常喜欢这个,所以任何帮助将不胜感激!如果我能提供其他任何帮助,请告诉我,我会添加它。
答案 0 :(得分:0)
GoogleApiClient可以附加到Activity,并设置为自动管理,也可以附加到应用程序(或其他Singleton),并手动管理。您将它附加到非ui片段是没有意义的,因为它没有生命周期且无法自动管理。
根据您的需要,扩展应用程序类(Google获取说明),向其中添加GoogleApiClient变量。在应用程序的onCreate
中初始化它,并处理onConnected
回调。