【发布时间】:2016-01-09 11:20:11
【问题描述】:
我在 android AccountManager 中提供的 getAuthToken() 上遇到问题(步骤如下):
- 将 authToken 重置为 null 后(在注销过程中)
- 使新的 null authToken 无效
- 将新的 authToken 设置为服务器提供的新字符串(重新登录)
- 使新字符串authToken失效
- 并尝试检查/获取新的 authToken,
但是在通过 getAuthToken() 方法获取新的 authToken 时,调用 future.getResult() 永远挂起。这不会发生在第一次登录 * 在帐户创建期间。我能够使用相同的可调用类获取身份验证令牌。
以下是我定义的可调用类。请就如何解决此问题提出建议。
private AccountManagerFuture<Bundle> future = null;
private String authToken;
class GetAuthTokenTask implements Callable<Bundle> {
private AccountManager accountManager;
private Account account;
private String authType;
private Activity activity;
public GetAuthTokenTask(AccountManager accountManager, Account account, String authType, Activity activity) {
this.accountManager = accountManager;
this.account = account;
this.authType = authType;
this.activity = activity;
}
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
@Override
public Bundle call() throws Exception {
return getAuthToken();
}
private Bundle getAuthToken() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
future = accountManager.getAuthToken(account, authType, null, activity, null, null);
try {
Bundle result = future.getResult();
if (result!=null) {
authToken = result.getString(AccountManager.KEY_AUTHTOKEN);
}
} catch (OperationCanceledException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (AuthenticatorException e) {
e.printStackTrace();
}
Bundle output = new Bundle();
output.putString(AccountManager.KEY_AUTHTOKEN, authToken );
return output;
}
}
//caller method
private String getAuthToken(Account account, String authType) {
ExecutorService es = Executors.newSingleThreadExecutor();
GetAuthTokenTask authTokenTask = new GetAuthTokenTask(accountManager, account, authType, (Activity)getBaseContext());
FutureTask<Bundle> result = new FutureTask<Bundle>(authTokenTask);
es.execute(result);
Bundle resultBundle = new Bundle();
try {
resultBundle = result.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return resultBundle.getString(AccountManager.KEY_AUTHTOKEN);
}
【问题讨论】:
-
尝试传入一个 AccountManagerCallback 并从包中获取它。 Authenticator 中的 getAuthToken 方法仅在 auth 令牌为空时才被调用。如果有一组,它将简单地在回调的捆绑中返回
-
你的意思是这样吗,
private AccountManagerCallback<Bundle> callBack = new AccountManagerCallback<Bundle>() { @Override public void run(final AccountManagerFuture<Bundle> arg0) { try { authToken = (String)future.getResult().get(AccountManager.KEY_AUTHTOKEN); // this is your auth token } catch (Exception e) { // handle error } } }; -
看起来差不多。进展如何。
-
它仍然挂在 future.getResult() / arg0.getResult()
-
你能发布你的验证码吗