【发布时间】:2014-05-18 08:17:42
【问题描述】:
我目前正在尝试处理我正在编写的演示应用程序中的一种情况,其中我有一个过期的访问令牌,我需要使用刷新令牌来获取一个新的访问令牌。现在对于这样的后台任务,我通常会像我的应用程序当前那样使用 AsyncTask 来登录(这工作正常),但我不知道如何做到这一点 - 如果它甚至可以完成(我确定它可以,但我现在没看到)。
以下是我当前的流程 - 对 get() 的调用阻塞了 UI 线程,这不是我应该在这里做的。我们的访问票据类同时包含访问令牌和刷新令牌。
public boolean isLoggedIn() {
if (isFreshAccessToken())
return true;
// If the access token is expired, we'll need to use the
// refresh token to get another one. Use a background task
// to do this.
String refreshToken = preferences.getString(REFRESH_TOKEN_KEY, null);
if (StringUtils.isNotBlank(refreshToken)) {
RefreshAccessTokenAsyncTask refreshLogin = new RefreshAccessTokenAsyncTask();
refreshLogin.execute(refreshToken);
try {
return refreshLogin.get();
} catch (Exception e) {
Log.d(TAG, "isLoggedIn() : Exception in async task. Returning false.");
return false;
}
} else
return false;
}
这是我的 AsyncTask 实现当前的样子。 refreshAccessTicket() 方法只是进行 REST 调用以获取 AccessTicket 响应。
private class RefreshAccessTokenAsyncTask extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
String refreshToken = params[0];
try {
// Get a new access token using the refresh token
// in the background ...
AccessTicket accessTicket = refreshAccessTicket(refreshToken);
// ... and save the updated information to the shared
// preferences
saveAccessTicket(accessTicket);
return true;
} catch (Exception ex) {
// If the call for a new access token fails for any reason,
// return FALSE. We'll force the user to log in again to
// get a completely new access ticket.
return false;
}
}
@Override
protected void onPostExecute(Boolean isLoggedIn) {
super.onPostExecute(isLoggedIn);
Log.d(TAG, "RefreshAccessTokenAsyncTask.onPostExecute() : " +
"Returning isLoggedIn value of " + isLoggedIn);
}
}
我在这里缺少什么?正如我上面提到的,我希望这个过程保持静默 - 如果访问令牌已过期,我想使用刷新令牌自动获取新的访问令牌,而无需用户执行任何操作或让应用程序跳出当前流程的(例如获取朋友列表等) - 它会在后台发生。我应该使用 AsyncTask 以外的东西吗?
【问题讨论】:
标签: java android android-asynctask android-handler