使用 CountdownLatch 从 accountmanager 获取 Auth Token
Getting an Auth Token from accountmanager using a CountdownLatch
在向服务器发出请求之前,我试图从 Android 中的帐户获取身份验证令牌。我正在尝试使用 CountdownLatch 控制流量,以便它等到:
- a) 超时(10s)
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。奇怪的。我绝对做错了什么。
感谢您的帮助!
此解释假定发布的代码 运行ning 在主线程上。因为getAuthToken()调用中的Handler参数为null,回调也会在主线程运行。这是一个僵局。在调用 getAuthToken() 之后,主线程阻塞在闩锁 await() 上。回调不能运行 因为主线程被阻塞了。锁存器永远不会倒计时到零,因为回调不能 运行.
发布的代码 at this blog 提供了一个示例,说明如何在不阻塞的情况下在主线程上获取身份验证令牌。
在向服务器发出请求之前,我试图从 Android 中的帐户获取身份验证令牌。我正在尝试使用 CountdownLatch 控制流量,以便它等到:
- a) 超时(10s)
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。奇怪的。我绝对做错了什么。 感谢您的帮助!
此解释假定发布的代码 运行ning 在主线程上。因为getAuthToken()调用中的Handler参数为null,回调也会在主线程运行。这是一个僵局。在调用 getAuthToken() 之后,主线程阻塞在闩锁 await() 上。回调不能运行 因为主线程被阻塞了。锁存器永远不会倒计时到零,因为回调不能 运行.
发布的代码 at this blog 提供了一个示例,说明如何在不阻塞的情况下在主线程上获取身份验证令牌。