【问题标题】:android getAuthToken hang after authToken resetauthToken重置后android getAuthToken挂起
【发布时间】:2016-01-09 11:20:11
【问题描述】:

我在 android AccountManager 中提供的 getAuthToken() 上遇到问题(步骤如下):

  1. 将 authToken 重置为 null 后(在注销过程中)
  2. 使新的 null authToken 无效
  3. 将新的 authToken 设置为服务器提供的新字符串(重新登录)
  4. 使新字符串authToken失效
  5. 并尝试检查/获取新的 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&lt;Bundle&gt; callBack = new AccountManagerCallback&lt;Bundle&gt;() { @Override public void run(final AccountManagerFuture&lt;Bundle&gt; arg0) { try { authToken = (String)future.getResult().get(AccountManager.KEY_AUTHTOKEN); // this is your auth token } catch (Exception e) { // handle error } } };
  • 看起来差不多。进展如何。
  • 它仍然挂在 future.getResult() / arg0.getResult()
  • 你能发布你的验证码吗

标签: android accountmanager


【解决方案1】:

尽量避免使用这样的活动

future = accountManager.getAuthToken(account, authType, null, true, null, null);

【讨论】:

  • 欢迎来到 Stack Overflow!虽然您可能已经解决了这个用户的问题,但纯代码的答案对于将来遇到这个问题的用户来说并不是很有帮助。请编辑您的答案,以解释您的代码解决原始问题的原因。
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多