1

在向服务器发出请求之前,我正在尝试从 Android 中的帐户获取身份验证令牌。我正在尝试使用 CountdownLatch 控制流程,以便它等到:

  • a) 超时(10 秒)
  • b) 我们得到令牌

    private CountDownLatch tokenLatch = new CountDownLatch(1);
    final long tokenTimeoutSeconds = 10;
    AccountManager manager = AccountManager.get(mContext);
    Account userAccount = getCurrentAccount();
    // Get the auth token
    if (userAccount != null) {
        AccountManagerFuture<Bundle> future = manager.getAuthToken(userAccount, AccountUtility.AUTHTOKEN_TYPE_FULL_ACCESS, true, new AccountManagerCallback<Bundle>() {
            @Override
            public void run(AccountManagerFuture<Bundle> future) {
                try {
                    Bundle bundle = future.getResult();
                    currentAuthToken = bundle.get(AccountManager.KEY_AUTHTOKEN).toString();
                    tokenLatch.countDown();
                } catch (Exception e) {
                    Log.e(LOG_TAG, "Problem getting auth token!", e);
                }
            }
        }, null);
    
        try {
            tokenLatch.await(tokenTimeoutSeconds, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            Log.e(LOG_TAG, "Interupted while getting auth token!", e);
        }
    

上下文被传递:

mContext = ...  getApplicationContext();

现在它在这两种情况中的任何一种之前退出。但是,它总是在所有其他进程完成后到达 AccountManagerCallback。奇怪的。我肯定做错了什么。感谢您的帮助!

4

1 回答 1

2

这个解释假定发布的代码在主线程上运行。因为 getAuthToken() 调用中的 Handler 参数为 null,所以回调也会在主线程上运行。这是一个僵局的情况。在调用 getAuthToken() 之后,主线程阻塞在锁存器 await() 上。由于主线程被阻塞,回调无法运行。锁存器永远不会倒数到零,因为回调无法运行。

此博客上发布的代码提供了一个示例,说明如何在主线程上获取身份验证令牌而不会阻塞。

于 2015-06-25T05:47:26.503 回答