gpt4 book ai didi

java - "silently"的 Android 进程使用刷新 token 获取新的访问 token

转载 作者:太空狗 更新时间:2023-10-29 14:15:09 27 4
gpt4 key购买 nike

我目前正在尝试处理我正在编写的演示应用程序中的一种情况,我的访问 token 已过期,我需要使用刷新 token 来获取新的访问 token 。现在对于这样的后台任务,我通常会像我的应用程序当前用于登录的那样使用 AsyncTask(它工作正常),但我不确定如何执行此操作 - 如果它甚至可以完成(我确定它可以,但我现在还没有看到)。

下面是我当前的流程 - 对 get() 的调用阻塞了 UI 线程,这不是我应该在这里做的。我们的访问票证类包含访问 token 和刷新 token 。

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);
}

}

我在这里错过了什么?正如我上面提到的,我希望此过程保持静默 - 如果访问 token 已过期,我想使用刷新 token 自动获取新的访问 token ,而无需用户执行任何操作或让应用程序跳出当前流程的(例如获取好友列表等)- 它会在后台发生。我应该使用 AsyncTask 以外的东西吗?

最佳答案

AsyncTask 应该可以正常工作,但您无法获得那样的结果。试试这样的方法。

private interface Callback {
void done(boolean result);
}

private class RefreshAccessTokenAsyncTask extends AsyncTask<String, Void, Boolean> {

private Callback cb;

private RefreshAccessTokenAsyncTask(Callback callback)
cb = callback;
}

@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);
cb.done(isLoggedIn);
}

然后像这样使用 AsyncTask:

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)) {
Callback callback = new Callback() {
public void done(boolean result){
// whatever you need to do here
}
}
RefreshAccessTokenAsyncTask refreshLogin = new RefreshAccessTokenAsyncTask(callback);
refreshLogin.execute(refreshToken);
} else
return false;
}

关于java - "silently"的 Android 进程使用刷新 token 获取新的访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22889540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com