【问题标题】:Is there a method to refresh token with timer using retrofit?有没有一种方法可以使用改造来刷新带有计时器的令牌?
【发布时间】:2021-03-21 01:37:36
【问题描述】:

我正在尝试使用改造从 api 检索数据。将要使用的请求需要一个访问令牌来传递标头。问题是令牌在 10 分钟后过期,刷新令牌请求需要一个未过期的令牌来创建一个新令牌! 那么我应该怎么做才能让令牌在通过 10 分钟之前自行刷新呢? 我已经尝试过 Interceptor 但它无法解决此类问题,因为我需要一个有效的令牌才能获得一个新的

【问题讨论】:

  • 你使用拦截器的方式是拦截改造的第一个失败的请求,然后当场执行刷新令牌方法,并用新创建的令牌替换旧的 API 请求,然后您将重试,这一切都发生在拦截器内部,并且可能非常错误且难以维护,请查看我的答案,如果您需要进一步的帮助,请告诉我

标签: android api retrofit2 access-token okhttp


【解决方案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'sonCreate函数中

UpdateTokenWorkManger.renewToken()

【讨论】:

  • 我试过这段代码,但我不知道为什么在日志中 doWork 函数只工作一次。我想问你关于 App.getApplication() 如果我在 renewToken 函数中传递一个上下文作为替代,这是否正常?并感谢您的回答,我真的很感激
  • 哦,我每次都在 Result.success() 的 1 分钟内测试它的问题,所以 workmanager 不会重复工作
  • 你可以设置任何你想要的时间间隔,但最小值是 15 分钟,所以你必须至少输入 15 进行测试
  • 如果我的回答对您有所帮助,如果您能将其标记为解决方案,我将不胜感激
  • 是的,但令牌每 10 分钟刷新一次,我需要在这之前更新它,这就是我面临的问题,我认为可能 alarmManager 更适合我的问题不是吗?
猜你喜欢
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
相关资源
最近更新 更多