Android AccountManager阻止GetAuthToken被卡住

Android AccountManager阻止GetAuthToken被卡住,android,sync,accountmanager,auth-token,Android,Sync,Accountmanager,Auth Token,我一直在使用 作为创建自己的SyncAdapter的基础。添加新帐户似乎效果不错,但一旦我想使用AccountManager.blockingGetAuthToken(…获取authtoken,它就会卡住,几分钟后抛出OperationCanceledException 有人知道这里可能出了什么问题吗?代码与示例几乎相同,只是我正在对自己的服务器进行身份验证 05-24 23:00:23.258:错误/同步适配器(4961):操作取消ExcetPion 05-24 23:00:23.258:错误

我一直在使用 作为创建自己的SyncAdapter的基础。添加新帐户似乎效果不错,但一旦我想使用AccountManager.blockingGetAuthToken(…获取authtoken,它就会卡住,几分钟后抛出OperationCanceledException

有人知道这里可能出了什么问题吗?代码与示例几乎相同,只是我正在对自己的服务器进行身份验证

05-24 23:00:23.258:错误/同步适配器(4961):操作取消ExcetPion 05-24 23:00:23.258:错误/同步适配器(4961):android.accounts.OperationCanceledException 05-24 23:00:23.258:ERROR/SyncAdapter(4961):位于android.accounts.AccountManager$AmsTask.internalGetResult(AccountManager.java:1255) 05-24 23:00:23.258:ERROR/SyncAdapter(4961):位于android.accounts.AccountManager$AmsTask.getResult(AccountManager.java:1260) 05-24 23:00:23.258:ERROR/SyncAdapter(4961):位于android.accounts.AccountManager$AmsTask.getResult(AccountManager.java:1181)
05-24 23:00:23.258:ERROR/SyncAdapter(4961):在android.accounts.AccountManager.blockingGetAuthToken(AccountManager.java:737)

blockingGetAuthToken
方法是同步调用
getAuthToken
的助手


如果您正在访问网络以检索auth token,则在请求成功之前,您将被阻止。您应该检查是否可以从应用程序中正确访问网络资源。

原始方法是获取authtoken的方便方法,而不是调用方法getAuthToken。 必须通过调用methed runOnUIthread来确保不在主线程中。或者,您可以调用默认方法getAuthToken并使用callback执行下一条指令。例如

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();
final accountmanager future=mAccountManager.getAuthToken(account,AccountConfig.AUTHTOKEN_TYPE,null,this,null,null);
新线程(newrunnable()){
@凌驾
公开募捐{
试一试{
Bundle bnd=future.getResult();
最终字符串authtoken=bnd.getString(AccountManager.KEY\u authtoken);
如果(authtoken==null){
返回;
}
//此回调接口方法
logoutCallback.onLogoutFinished(authtoken);
}捕获(例外e){
e、 printStackTrace();
}
}
}).start();

谢谢。您的回答确实给了我正确的方向。我直到现在才真正理解身份验证的流程。我的问题是,我的身份验证程序在确认密码时卡住了,不是因为网络连接问题,而是在上下文为空时尝试获取首选项时卡住了。