GoogleAuthUtil.getToken() 方法抛出 IllegalStateException

GoogleAuthUtil.getToken() method throws IllegalStateException

我使用了 GoogleApiClient 对象,继承了 ConnectionCallbacks 接口并从两种不同的方法调用 GoogleAuthUtil.getToken(Context context, String accountName, String scope)

1. 覆盖 ConnectionCallbacks 接口的 onConnected() 方法。

  1. onClick()按钮方法

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

  1. onConnected() 方法调用时:它抛出如下错误:java.lang.IllegalStateException : 从你的主线程调用它会导致死锁。

  2. 如果从 onClick() 方法调用,它工作正常!!!

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

onClick() 方法:

@Override
public void onClick(View v) {
    getGoogleToken();
}

onConnected() 方法:

@Override
public void onConnected(Bundle arg0) {
     getGoogleToken();
 }

getGoogleToken() 方法:

private void getGoogleToken() {
    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();
    }
}

这里是堆栈跟踪:

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();