Краткий вопрос
Привет, я хочу получить текущий сопрограмм, а затем вызвать delay () из дочернего класса. Что-то вроде Thread.currentThread().sleep()
в потоках.
Я думаю вот так:
fun main() {
GlobalScope.launch {
classA.method1()
}
}
classA.method1() {
try{
val coroutin = tryTogetContext()
coroutin.delay(1000L) //Then i can call some methods like this
} catch( e:Exception){
}
}
Подробный вопрос
Я использую модификацию для сети и использую oauth2 для авторизации и аутентификация. Я использую okhttp s Authenticator класс, который будет вызывать метод с именем authenticate(route: Route?, response: Response): Request?
, когда когда-либо удаленно получает ошибку 401 ~ 403, и в основном мне пришлось получить новый токен с refre sh токен и повторите последний запрос с новым токеном.
Но в моем случае у меня есть два ограничения.
1-Первый
доступ -token и refre sh -token не приходят из одного места, а также refre sh -token время жизни короче, чем access-token время жизни. Таким образом, каждый раз, когда истекает срок действия моего токена, я могу быть уверен, что срок действия refre sh -toke истек раньше! И мне пришлось сделать новый вызов syn c там, чтобы получить новый токен refre sh и новый вызов syn c для получения нового токена, а затем повторить мой последний запрос с новым токеном. (Я не разрабатывал эту процедуру, поэтому я не могу ее изменить, если смогу, я получу токен и обновлю sh токен за один запрос!)
2-секундный
Мне пришлось использовать некоторую внешнюю библиотеку, которая дает мне токен в качестве моего токена refre sh (это также принудительно по системе), поэтому я не могу сделать запрос syn c внутри класса аутентификатора, потому что эта библиотека находится в жизненном цикле активности и уровень, и я также не хочу создавать ненужные зависимости и связи.
ПРОБЛЕМА
Итак, после ответа без аутентификации я создам событие, чтобы сообщить другому class: "Эй, мне нужен refre sh token! , а затем я хочу на время остановить текущий сопрограмму или поток, чтобы убедиться, что запрос refre sh токена выполнен и токены заполнены в диспетчере токенов перед повторить последний запрос! Другим способом я не хочу создавать зависимости и ненужную связь между этими двумя классами, поэтому я просто хочу подождать 2 se c и повторить попытку вместо передачи некоторого интерфейса или.
Итак fo r теперь я добавил SystemClock.sleep (2000) , потому что я думаю, что это единственный способ задержать запрос httpClient , но, похоже, у меня не работает использование coroutin для запрос на запуск дооснащения. (также мои методы модернизации интерфейса являются приостановленными методами)
Мой метод аутентификации похож на:
override fun authenticate(route: Route?, response: Response): Request? {
Timber.i("$TAG http ---- on Authenticate ${response.networkResponse?.request?.url}")
tokenManager.needRefreshTokenTrigger() //Will rise an event for lib to get new refresh token
Timber.i("$TAG http ----needRefreshTokenTrigger! $route")
SystemClock.sleep(2000) //It seems not works with coroutine!
return generateRequest(response) //generate new request with refresh token and handle
}
Этот код работает хорошо, но из-за задержки не работает, мой последний неудавшийся запрос будет повторять 3 ~ 5 раз с той же ошибкой 40x (зависит от скорости внешней библиотеки для получения токена refre sh). Итак, теперь я подумываю получить текущую сопрограмму внутри этого метода и добавить для меня некоторую задержку. Если это сработает, мой запрос будет более эффективным.