Я пытаюсь получить данные из 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()
Я попробовал этот код, но я не знаю, почему в журнале функция doWork работает только один раз. и я хочу спросить вас о App.getApplication(), это нормально, если я передам контекст в функцию renewToken в качестве альтернативы? и спасибо за ответ я очень ценю это
о, проблема в том, что я тестировал его в течение 1 минуты w Result.success() каждый раз, поэтому workmanager не повторяет работу
вы можете установить его на любой временной интервал, который вы хотите, но минимум составляет 15 минут, поэтому вам нужно ввести 15 по крайней мере для тестирования.
и если мой ответ помог вам, то я был бы признателен, если бы вы могли отметить его как решение
да, но токен обновляется каждые 10 минут, мне нужно обновить его, прежде чем это проблема, с которой я столкнулся, я думаю, может быть, alarmManager лучше для моей проблемы, не так ли?
очень странно видеть токен, который нуждается в обновлении каждые 10 минут, я думаю, что стандарт - это 30 минут-1 час, но для этого, возможно, лучше использовать второй подход перехватчика, который повторяет попытки.
это тоже не работает, потому что проблема, когда первый запрос не удался, я не могу использовать перехватчик, потому что срок действия старого токена истек, и мне нужен неистекший, чтобы получить новый токен
какой сервис вы используете для аутентификации?
на самом деле я использую сервис компании на локальном хосте
если нет риска для безопасности с обновлением каждые 15-30 минут, тогда я думаю, вам следует запросить это редактирование у вашей внутренней команды.
то, как вы будете использовать перехватчик, заключается в перехвате первого неудачного запроса от модификации, а затем на месте выполнения метода обновления токена и замены вашего старого запроса API новым с вновь созданным токеном, а затем вы сделаете повторную попытку, все это происходит внутри перехватчика и может быть довольно глючным и сложным в обслуживании, взгляните на мой ответ и дайте мне знать, если вам нужна дополнительная помощь