有没有一种方法可以使用改造来刷新带有计时器的令牌?
Posted
技术标签:
【中文标题】有没有一种方法可以使用改造来刷新带有计时器的令牌?【英文标题】:Is there a method to refresh token with timer using retrofit? 【发布时间】:2021-03-21 01:37:36 【问题描述】:我正在尝试使用改造从 api 检索数据。将要使用的请求需要一个访问令牌来传递标头。问题是令牌在 10 分钟后过期,刷新令牌请求需要一个未过期的令牌来创建一个新令牌! 那么我应该怎么做才能让令牌在通过 10 分钟之前自行刷新呢? 我已经尝试过 Interceptor 但它无法解决此类问题,因为我需要一个有效的令牌才能获得一个新的
【问题讨论】:
你使用拦截器的方式是拦截改造的第一个失败的请求,然后当场执行刷新令牌方法,并用新创建的令牌替换旧的 API 请求,然后您将重试,这一切都发生在拦截器内部,并且可能非常错误且难以维护,请查看我的答案,如果您需要进一步的帮助,请告诉我 【参考方案1】:您可以使用 Worker
并将其设置为每 30 分钟左右运行一次,并将其设置为将更新的令牌保存在您的 SharedPreference
中
这是Worker
的示例
class UpdateTokenWorkManger(
val context: Context,
params: WorkerParameters) : Worker(context, params)
override fun doWork(): Result
LoginHandler.refreshTokenSilently()
// Indicate whether the work finished successfully with the Result
return Result.success()
companion object
private const val TAG = "Token Refresh "
const val TOKEN_REFRESH_WORK_MANGER_ID = "automatic_renew_token_work_manger"
fun renewToken()
val periodicRefreshRequest = PeriodicWorkRequest.Builder(
UpdateTokenWorkManger::class.java, // Your worker class
30, // repeating interval
TimeUnit.MINUTES
)
val periodicWorkRequest: PeriodicWorkRequest = periodicRefreshRequest
.build()
WorkManager.getInstance(App.getApplication()).enqueueUniquePeriodicWork(
TOKEN_REFRESH_WORK_MANGER_ID,
ExistingPeriodicWorkPolicy.REPLACE,
periodicWorkRequest
)
要使用此组件,您将需要这些依赖项
implementation "androidx.work:work-runtime-ktx:2.4.0"
还请注意,LoginHandler
是应该负责处理您的登录、刷新和注销方案的类。
并且不要忘记在登录Activity
之后将此行添加到您的第一个Activity
,例如:如果您登录SplashActivity
并在成功验证后重定向到MainActivity
,那么此行应该在MainActivity's
onCreate
函数中
UpdateTokenWorkManger.renewToken()
【讨论】:
我试过这段代码,但我不知道为什么在日志中 doWork 函数只工作一次。我想问你关于 App.getApplication() 如果我在 renewToken 函数中传递一个上下文作为替代,这是否正常?并感谢您的回答,我真的很感激 哦,我每次都在 Result.success() 的 1 分钟内测试它的问题,所以 workmanager 不会重复工作 你可以设置任何你想要的时间间隔,但最小值是 15 分钟,所以你必须至少输入 15 进行测试 如果我的回答对您有所帮助,如果您能将其标记为解决方案,我将不胜感激 是的,但令牌每 10 分钟刷新一次,我需要在这之前更新它,这就是我面临的问题,我认为可能 alarmManager 更适合我的问题不是吗?以上是关于有没有一种方法可以使用改造来刷新带有计时器的令牌?的主要内容,如果未能解决你的问题,请参考以下文章