2011-05-24 105 views
2

我一直在使用SampleSyncAdapter 作爲創建我自己的SyncAdapter的基礎。它似乎很好地添加一個新的帳戶,但一旦我想通過AccountManager.blockingGetAuthToken(...它被卡住,然後在幾分鐘後拋出一個OperarationCanceledException的authtoken。AccountManager blockingGetAuthToken卡住

有沒有人有一個想法這裏可能有什麼錯誤?除了我正在向我自己的服務器進行身份驗證之外,代碼與樣本幾乎相同

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:ERROR/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:ERROR/SyncAdapter(4961):at android.accounts.AccountManager $ AmsTask.getResult(AccountManager.java:1181) 05-24 23:00:23.258:ERROR/SyncAdapter(4961):在android.accounts.AccountManager.blockingGetAuthToken(AccountManager.java:737)

回答

2

blockingGetAuthToken方法是同步呼叫getAuthToken的助手。

如果您正在訪問網絡以檢索身份驗證令牌,您將被阻止,直到請求成功。您應該檢查您是否可以從應用程序內正確訪問網絡資源。

+0

謝謝。你的回答確實使我走向了正確的方向。我直到現在才真正瞭解認證的流程。我的問題是我的身份驗證器在確認密碼時卡住了,不是因爲網絡連接問題,而是在上下文爲空時嘗試獲取「首選項」。 – likebobby 2011-05-25 07:22:38

0

原來的方法是一種獲取authtoken的方便方法,而不是調用方法getAuthToken。 必須通過調用methed runOnUIthread來確保不在mainthread中。或者您可以調用默認方法getAuthToken並使用回調來執行下一條指令。爲例。

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