【问题标题】:GoogleAPIClient not connecting after phone rotated手机旋转后GoogleAPIClient未连接
【发布时间】:2017-09-07 20:27:04
【问题描述】:

我有一个用于创建包含 GoogleApiClient 的地理围栏的类,当前由两个活动访问(由关注 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 客户端正在重新连接,但由于某种原因,当我尝试访问它时,我得到一个空值。

这是显示两者的 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)

在这个问题上相当迷惑,所以任何帮助都将不胜感激!如果还有什么我可以提供的帮助,请告诉我,我会添加它。

【问题讨论】:

    标签: android android-fragments google-api-client


    【解决方案1】:

    GoogleApiClient 可以附加到 Activity,并设置为自动管理,也可以附加到应用程序(或另一个 Singleton),并手动管理。您将其附加到非 ui 片段是没有意义的,因为它没有生命周期并且无法自动管理。
    根据您的需要,扩展应用程序类(Google 获取说明),向其中添加一个 GoogleApiClient 变量。在应用的onCreate初始化,处理onConnected回调。

    【讨论】:

    • 我目前正在使用 Application 类来管理我的数据库访问(让我缓存结果以最大程度地减少数据库调用),我是否正确地说只允许一个 Application 类?不过我会研究一下自动管理,非常感谢。
    • @Biggs 您使用相同的 Application 类。您似乎对应用程序类是什么感到困惑。
    • 我必须承认,我最初使用它是为了庆祝 Mary,而不是经过深思熟虑的设计。我对它的基本理解是,它是一个贯穿应用程序生命周期的类,尽管我确信它比这更微妙。
    • @Biggs 完美。所以也将GoogleApiClient 变量添加到它。
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多