2011-05-24 109 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();