2011-05-24 2 views
2

J'ai utilisé le SampleSyncAdapter comme base pour créer mon propre SyncAdapter. Il semble bien fonctionner pour ajouter un nouveau compte, mais une fois que je veux obtenir le authtoken avec AccountManager.blockingGetAuthToken (... il est bloqué puis lance une exception OperarationCanceledException après quelques minutes.)AccountManager blockingGetAuthToken est bloqué

Quelqu'un a une idée de Le code est presque le même que l'exemple, sauf que je m'authentifie auprès de mon propre serveur

05-24 23: 00: 23.258: ERROR/SyncAdapter (4961): OperationCanceledExcetpion 05-24 23 : 00: 23.258: ERROR/SyncAdapter (4961): android.accounts.OperationCanceledException 05-24 23: 00: 23.258: ERREUR/SyncAdapter (4961): at android.accounts.AccountManager $ AmsTask.internalGetResult (AccountManager.java:1255) 05-24 23:00 : 23.258: ERROR/SyncAdapter (4961): at android.accounts.AccountManager $ AmsTask.getResult (AccountManager.java:1260) 05-24 23: 00: 23.258: ERREUR/SyncAdapter (4961): at android.accounts.AccountManager AmsTask.getResult $ (AccountManager.java:1181) 05-24 23: 00: 23,258: eRREUR/SyncAdapter (4961): à android.accounts.AccountManager.blockingGetAuthToken (AccountManager.java:737)

Répondre

2

La méthode blockingGetAuthToken est un assistant qui appelle getAuthToken de manière synchrone.

Si vous accédez au réseau pour récupérer le jeton d'authentification, vous serez bloqué jusqu'à ce que la requête aboutisse. Vous devriez vérifier que vous pouvez accéder à la ressource réseau correctement depuis votre application.

+0

Merci. Votre réponse m'a mis dans la bonne direction. Je n'ai pas vraiment compris le flux de l'authentification jusqu'à maintenant. Mon problème était que mon authentificateur était bloqué lors de la confirmation du mot de passe, pas à cause de problèmes de connectivité réseau, mais lorsque j'essayais d'obtenir des Préférences lorsque le contexte était nul. – likebobby

0

La méthode originale est un moyen pratique d'obtenir authtoken en appelant la méthode getAuthToken. devez vous assurer pas dans le thread principal en appelant methed runOnUIthread. ou vous pouvez appeler la méthode par défaut getAuthToken et utiliser le rappel pour exécuter l'instruction suivante. pour l'exemple.

final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, AccountConfig.AUTHTOKEN_TYPE, null, this, null, null); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 

       Bundle bnd = future.getResult(); 
       final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN); 
       if (authtoken == null) { 
        return; 
       } 
       // this callback interface method 
       logoutCallback.onLogoutFinished(authtoken); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start();