我一直在使用SampleSyncAdapter 作为创建自己的SyncAdapter的基础。它似乎很适合添加一个新帐户,但是一旦我想用AccountManager.blockingGetAuthToken获取authtoken(...它会卡住,然后在几分钟后抛出OperarationCanceledException。
有没有人知道这里可能出现什么问题?除了我正在对我自己的服务器进行身份验证之外,代码几乎与示例相同。
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):在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)
答案 0 :(得分:2)
blockingGetAuthToken
方法是一个同步调用getAuthToken
的助手。
如果您正在访问网络以检索身份验证令牌,您将被阻止,直到请求成功为止。您应该检查是否可以从应用程序中正确访问网络资源。
答案 1 :(得分: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();