2017-01-25 4 views
1

Ich habe GoogleApiClient Objekt verwendet, geerbt ConnectionCallbacks Schnittstelle und Aufruf GoogleAuthUtil.getToken(Context context, String accountName, String scope) von zwei verschiedenen Methoden.

1. übersteuern onConnected() Methode von ConnectionCallbacks Schnittstelle.GoogleAuthUtil.getToken() -Methode löst IllegalStateException

  1. onClick() methode der taste.

In diesen beiden erhalte ich unterschiedliche Reaktion von getToken() Methode.

  1. während von Aufruf onConnected() Methode: es wirft Fehler wie: java.lang. IllegalStateException: Wenn Sie dies von Ihrem Haupt-Thread aus aufrufen, kann dies zu einem Deadlock führen.

  2. Im Fall beim Anruf von onClick() Methode, funktioniert es gut !!!

Was ist der Unterschied zwischen diesen 2 Aufrufen? onClick() wird im Hauptthread ausgeführt. Recht?

onClick() Methode:

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

onConnected() Methode:

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

getGoogleToken() Methode:

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

Hier 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

machst du für Google Anmeldung? –

+0

Ja. Ich mache das. – pratik03

+0

Ich bin gespannt, warum/wie Sie GoogleAuthUtil anstelle des eigentlichen Google Sign-In SDK verwendet haben. https://developers.google.com/identity/sign-in/android/ ... wir werden GoogleAuthUtil ablehnen –

Antwort

1

Versuchen Sie, den folgenden Codeblock in einem Hintergrundthread auszuführen.

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

Danke. Es funktioniert gut.! – pratik03

+0

@ pratik03 versuche den Thread mit IntentService zu ersetzen, um den obigen Code zu verbessern –

Verwandte Themen