Android getToken()方法引发IllegalStateException

Android getToken()方法引发IllegalStateException,android,google-signin,google-authentication,Android,Google Signin,Google Authentication,我使用了GoogleAppClient对象,继承了ConnectionCallbacks接口,并从两个不同的方法调用了GoogleAuthUtil.getToken(上下文上下文、字符串帐户名、字符串范围)。 1.重写onConnected()方法的ConnectionCallbacks接口 onClick()按钮的方法 在这两种方法中,我得到了不同的getToken()方法响应 从onConnected方法调用时:它会抛出类似java.lang的错误。IllegalStateException

我使用了
GoogleAppClient
对象,继承了
ConnectionCallbacks
接口,并从两个不同的方法调用了
GoogleAuthUtil.getToken(上下文上下文、字符串帐户名、字符串范围)


1.重写
onConnected()
方法的
ConnectionCallbacks
接口

  • onClick()
    按钮的方法
  • 在这两种方法中,我得到了不同的
    getToken()
    方法响应

  • 从onConnected方法调用时:它会抛出类似java.lang的错误。IllegalStateException:从主线程调用此方法可能会导致死锁

  • 如果从onClick()方法调用,工作正常

  • 这两个电话有什么区别
    onClick()
    在主线程中执行。对吧?

    onClick()方法:

    @覆盖
    公共void onClick(视图v){
    getGoogleToken();
    }
    
    onConnected()方法:

    @覆盖
    未连接的公共空间(捆绑arg0){
    getGoogleToken();
    }
    
    getGoogleToken()方法:

    private void getGoogleToken(){
    试一试{
    AccountManager am=AccountManager.get(MainActivity.this);
    Account[]accounts=am.getAccountsByType(GoogleAuthUtil.GOOGLE\u Account\u TYPE);
    //检索google令牌
    String token=GoogleAuthUtil.getToken(getApplicationContext(),帐户[0]。名称,私钥);//此行生成错误。
    // ...
    }捕获(例外情况除外){
    例如printStackTrace();
    }
    }
    
    这里是stackTrace:

    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err: java.lang.IllegalStateException: Calling this from your main thread can lead to deadlock
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.common.internal.zzx.zzcy(Unknown Source)
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.auth.GoogleAuthUtil.zza(Unknown Source)
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at num.app.gpluslogin.MainActivity.getGoogleToken(MainActivity.java:274)
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at num.app.gpluslogin.MainActivity.onConnected(MainActivity.java:207)
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.common.internal.zzk.zzk(Unknown Source)
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.internal.zzmg.zzi(Unknown Source)
    01-25 17:53:02.700 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.internal.zzme.zzpi(Unknown Source)
    01-25 17:53:02.701 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.internal.zzme.onConnected(Unknown Source)
    01-25 17:53:02.701 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.internal.zzmi.onConnected(Unknown Source)
    01-25 17:53:02.701 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.internal.zzlz.onConnected(Unknown Source)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.common.internal.zzj$zzg.zzqv(Unknown Source)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.common.internal.zzj$zza.zzv(Unknown Source)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.common.internal.zzj$zzc.zzqx(Unknown Source)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at com.google.android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at android.os.Looper.loop(Looper.java:148)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    01-25 17:53:02.702 23235-23235/num.app.gpluslogin W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    01-25 17:53:09.358 1587-1605/system_process W/ActivityManager: Launch timeout has expired, giving up wake lock!
    

    尝试在后台线程中执行下面的代码块

    new Thread(new Runnable() {
        public void run() {
    
         android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
    
            //Your code
    try {
    
            AccountManager am = AccountManager.get(MainActivity.this);
            Account[] accounts =  am.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
    
            //Retrieve the google token
            String token = GoogleAuthUtil.getToken(getApplicationContext(), accounts[0].name, PRIVATE_KEY); // This line generates error.
            .......
            .....
            }catch(Exception ex)
            {
              ex.printStackTrace();}
            }
    }).start();
    

    你在为谷歌注册做什么?是的。我正在这么做。我很想知道你为什么/如何使用GoogleAuthUtil而不是实际的Google登录SDK。。。我们打算反对GoogleAuthUtil@pratik03尝试使用IntentService替换线程,以改进上述代码