Android AccountManager阻止GetAuthToken被卡住
我一直在使用 作为创建自己的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)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:错误
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();
谢谢。您的回答确实给了我正确的方向。我直到现在才真正理解身份验证的流程。我的问题是,我的身份验证程序在确认密码时卡住了,不是因为网络连接问题,而是在上下文为空时尝试获取首选项时卡住了。