引起:java.lang.IllegalStateException:GoogleApiClient 尚未连接

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35853657/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 00:39:58  来源:igfitidea点击:

Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet

javaandroidandroid-studiogoogle-api-clientandroid-googleapiclient

提问by VIN

I am getting this error message when trying to implement logout for Google Sign-In for Android:

尝试为 Android 的 Google Sign-In 实现注销时,我收到此错误消息:

Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet.

The crash occurs in DrawerActivity.java (below), where I call the signOut() method.

崩溃发生在 DrawerActivity.java(如下)中,我在其中调用了 signOut() 方法。

I've looked at the solutions in other posts and have tried them to no avail:

我查看了其他帖子中的解决方案,并尝试过无济于事:

java.lang.IllegalStateException: GoogleApiClient is not connected yet

java.lang.IllegalStateException: GoogleApiClient 尚未连接

GoogleApiClient is not connected yet exceptionFatal Exception: java.lang.IllegalStateException GoogleApiClient is not connected yet

GoogleApiClient 尚未连接异常致命异常:java.lang.IllegalStateException GoogleApiClient 尚未连接

MainActivity.java:

主活动.java:

protected void onCreate(Bundle savedInstanceState) {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this, this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
    //... other code for google sign in not shown
}

protected void onStart() {
    mGoogleApiClient.connect();
}

private void handleSignInResult(GoogleSignInResult result) {
    if (result.isSuccess()) {
        App.getInstance().setClient(mGoogleApiClient);
        //start DrawerActivity
    }
}

In DrawerActivity.java (where I want to perform the sign out)

在 DrawerActivity.java (我想在其中执行注销)

private void googleSignOut(){
    mGoogleApiClient = App.getInstance().getClient();
    Auth.GoogleSignInApi.signOut(mGoogleApiClient);
}

In my App activity that extends Application (used to store the GoogleApiClient)

在我扩展应用程序的应用程序活动中(用于存储 GoogleApiClient)

public class App extends Application {

    private GoogleApiClient mGoogleApiClient;
    private static App mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized App getInstance() {
        return mInstance;
    }

    public void setClient(GoogleApiClient client){
        mGoogleApiClient = client;
    }

    public GoogleApiClient getClient(){
        return mGoogleApiClient;
    }
}

StackTrace:

堆栈跟踪:

21:33.314 25375-25375/com.me.myapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.me.myapp, PID: 25375
java.lang.IllegalStateException: GoogleApiClient is not connected yet.
at com.google.android.gms.internal.zzmf.zzb(Unknown Source)
at com.google.android.gms.internal.zzmi.zzb(Unknown Source)
at com.google.android.gms.internal.zzmg.zzb(Unknown Source)
at com.google.android.gms.auth.api.signin.internal.zzc.signOut(Unknown Source)
at com.me.myapp.DrawerActivity.googleSignOut(DrawerActivity.java:526)
at com.me.myapp.DrawerActivity.onNavigationDrawerItemSelected(DrawerActivity.java:512)
at com.me.myapp.NavigationDrawerFragment.selectItem(NavigationDrawerFragment.java:201)
at com.me.myapp.NavigationDrawerFragment.access
 @Override
protected void onStart() {
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
    mGoogleApiClient.connect();
    super.onStart();
}
0(NavigationDrawerFragment.java:31) at com.me.myapp.NavigationDrawerFragment.onItemClick(NavigationDrawerFragment.java:98) at android.widget.AdapterView.performItemClick(AdapterView.java:310) at android.widget.AbsListView.performItemClick(AbsListView.java:1145) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042) at android.widget.AbsListView.run(AbsListView.java:3879) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteI

Any help would be appreciated. Thanks!

任何帮助,将不胜感激。谢谢!

采纳答案by Scott Tomaszewski

You should ditch the threading and just create a second GoogleApiClient. According to this post (https://stackoverflow.com/a/25190497/608347) the client isn't a heavy object so might as well avoid the confusing design and make things simple. Even if you dont go down this path you should strip out that #setClientand #getClientcode and see if you get the same error when disconnecting from a single activity

您应该放弃线程并创建第二个GoogleApiClient. 根据这篇文章(https://stackoverflow.com/a/25190497/608347),客户端不是重物,所以不妨避免混乱的设计并使事情变得简单。即使你不走这条路,你也应该去掉它#setClient#getClient编写代码,看看在与单个活动断开连接时是否遇到相同的错误

回答by Chota Bheem

I know its quite old post and already answered.

我知道它很旧的帖子并且已经回答了。

However, the actual cause of the error is not object creation at single or multiple places but "enableAutoManage" invocation at the time of Building Client object.

但是,错误的实际原因不是在单个或多个位置创建对象,而是在构建客户端对象时调用“enableAutoManage”。

The API doc heresuggests that it would automatically do the life cycle management by calling methods on onStart & onStop methods of the activity.

此处的 API 文档建议它将通过调用活动的 onStart 和 onStop 方法上的方法来自动进行生命周期管理。

Therefore, if you want to use the same object across different activities then you should avoid calling "enableAutoManage" and invoke apiObject.connect(preferably in onStart of activity) and apiObject.disconnect() (preferably in onStop of activity).

因此,如果您想在不同的活动中使用相同的对象,那么您应该避免调用“enableAutoManage”并调用 apiObject.connect(最好在活动的 onStart 中)和 apiObject.disconnect()(最好在活动的 onStop 中)。

This worked for me, therefore sharing.

这对我有用,因此分享。

回答by Jose Manuel Duran

To make a button Sign Out in another Activity, for example: the login is in the Activity A and the sign out is in the activity B, then you can use this for the second activity.

要在另一个Activity中制作一个退出按钮,例如:登录在Activity A中,退出在Activity B中,那么您可以将其用于第二个Activity。

First create the OnStart method:

首先创建 OnStart 方法:

Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
    new ResultCallback<Status>() {
        @Override
        public void onResult(Status status) {
            // ...
            Toast.makeText(getApplicationContext(),"Logged Out",Toast.LENGTH_SHORT).show();
            Intent i=new Intent(getApplicationContext(),MainActivity.class);
            startActivity(i);
        }
    });

After in your button collocate this:

在你的按钮后搭配这个:

##代码##

回答by Tharaka Karunadheera

Remove this:

删除这个:

.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)

.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)