我正在Android上使用jwt实现代码 在使用刷新令牌时,我不确定我的代码是否正确。
这是我的流程的后续图表 服务器发出访问令牌和刷新令牌。这些过期时间为1小时和3天。这些令牌将保存到共享偏好中。
以上是图表的说明。
当访问令牌过期时,http调用将失败并显示401错误
所以我实现了getAccessToken()
来重新创建访问令牌。
(1):一个AsyncTask用于整个http调用步骤
- 我的AsyncTask太大了,我想重构它
(2):(1)AynsTask有重新获取访问令牌的逻辑。
- 这个逻辑重复了我所有的HTTP调用函数
(3):续订访问令牌后,我的应用重新尝试调用/ api / foo
- 要重试,AsyncTask的doBackground()
函数是递归调用。
这是我的代码段。
class ApplyCheck extends AsyncTask<String, Void, ResponseTypeEnum> {
private List<ApplyEntity> applyEntityList = null;
@Override
protected ResponseTypeEnum doInBackground(String... strings) {
try {
response = restManager.getApplyList(strings[0],"","",""); // call /api/foo
} catch (RestRuntimeException e) {
return ResponseTypeEnum.SERVER_ERROR;
}
switch (response.code()) {
case 200:
//set applyEntityList
....
return ResponseTypeEnum.SUCCESS;
case 401:
//<-- This routine is duplcated all my AsyncTasks
if(getAccessToken()) {
//<-- recursive call to re-call api
return doInBackground(strings);
} else {
return ResponseTypeEnum.TOKEN_EXPIRE;
}
}
}
//re-issue new access token
private boolean getAccessToken() {
Response response = restManager.getAccessToken(); // call /auth/issue-token
if(response.code() == 200) {
String tokens = response.body().string();
JSONObject jsonObject = new JSONObject(tokens);
sharedPreferences.edit().putString("accessToken", jsonObject.getString("accessToken"));
sharedPreferences.edit().putString("refreshToken", jsonObject.getString("refreshToken"));
return true;
} else {
return false;
}
我的问题
1.我的方法是否正确?如果没有,请通知我良好做法
2.如果是,是否为我的重复AsyncTasks提取常用功能有什么好的做法?
答案 0 :(得分:1)
您的流程很好,恕我直言。唯一的变化是,我不递归调用doInBackground。您正在执行的操作是可行的,但它违反了doInBackground的意图。而是修改您的AsyncTask以处理onPostExecute中的不同响应(即,链接您的请求),然后针对每个用例使用相关参数再次调用AsyncTask。这将使维护变得更加容易,因为您可以向AsyncTask添加特定方法来应对每种响应类型,并可以看到如何以线性方式触发它。如果需要更新onProgressUpdate,还应该将进度值传递给链接的AsyncTask调用,以便它可以保持进度的一致性。否则,它将在每次调用时重新启动。