我正在尝试使用改装从api中检索数据。要使用的请求需要一个访问令牌才能在标头中传递。问题是令牌在10分钟后过期,刷新令牌请求需要一个未过期的令牌来创建新令牌!那么,在经过10分钟之前,我应该怎么做才能让代币自行刷新呢?我已经尝试过Interceptor,但它不能解决这种类型的问题,因为我需要一个有效的令牌来获得一个新的
您可以使用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()