Получить текущую сопрограмму внутри дочернего класса и вызвать метод delay () - PullRequest
0 голосов
/ 17 июня 2020

Краткий вопрос

Привет, я хочу получить текущий сопрограмм, а затем вызвать 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). Итак, теперь я подумываю получить текущую сопрограмму внутри этого метода и добавить для меня некоторую задержку. Если это сработает, мой запрос будет более эффективным.

...