2017-01-25 1 views
1

J'ai utilisé l'objet GoogleApiClient, l'interface ConnectionCallbacks héritée et l'appel GoogleAuthUtil.getToken(Context context, String accountName, String scope) de deux méthodes différentes.

1. overriden onConnected() méthode de ConnectionCallbacks interface.La méthode GoogleAuthUtil.getToken() lance IllegalStateException

  1. onClick() méthode du bouton.

Dans ces deux, j'obtiens une réponse différente de la méthode getToken().

  1. tout en appelant de onConnected méthode(): il jette une erreur comme: java.lang. IllegalStateException: L'appel de votre thread principal peut entraîner un blocage. Au cas où vous appelez de onClick() la méthode, ça marche bien !!!

Quelle est la différence entre ces 2 appels? onClick() s'exécute dans le thread principal. Droite?

méthode onClick():

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

méthode onConnected():

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

méthode 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(); 
    } 
} 

Voici 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! 
+0

faites-vous pour google inscrivez-vous? –

+0

Oui. Je fais ça. – pratik03

+0

Je suis curieux de savoir pourquoi/comment vous avez utilisé GoogleAuthUtil au lieu du SDK Google Sign-In? https://developers.google.com/identity/sign-in/android/ ... nous allons désapprouver GoogleAuthUtil –

Répondre

1

Essayez d'exécuter le bloc de code ci-dessous dans un fil d'arrière-plan.

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

Merci. Cela fonctionne bien.! – pratik03

+0

@ pratik03 essayez de remplacer le thread avec IntentService pour l'améliorer par rapport au code ci-dessus –