CountDownLatch замораживает поток на Android - PullRequest
0 голосов
/ 05 мая 2019

У меня есть метод, в котором я хотел бы проверить действительность моего токена через вызов API с Retrofit, и я хочу дождаться результата. Я думал использовать CountDownLatch, но, похоже, countDownLatch.await() блокирует поток, и ничего не происходит, отладчик не доходит до части onResponse. Я проверил мой API с Почтальоном, звонок действительно ударил.

Я также нашел этот вопрос, который похож на мою проблему, но он не помог: CountDownLatch не освобождает поток

    var isTokenExpired = false

    var countDownLatch = CountDownLatch(1)

    val userService = RetrofitClient.getInstance().create(DiaBUserService::class.java)
    userService.validate(token).enqueue(object : Callback<JsonObject> {
        override fun onResponse(call: Call<JsonObject>, response: Response<JsonObject>) {
            isTokenExpired = !response.isSuccessful
            countDownLatch.countDown()
        }

        override fun onFailure(call: Call<JsonObject>, t: Throwable) {
            t.printStackTrace()
            countDownLatch.countDown()
        }
    })

    try {
        countDownLatch.await()
    } catch (e: InterruptedException){
        e.printStackTrace()
    }

    return isTokenExpired

Использую ли я что-то не так или есть другой способ получить нужную функцию?

1 Ответ

0 голосов
/ 06 мая 2019

Дооснащение Обратный звонок Документация гласит:

Callbacks are executed on the application's main (UI) thread.

Основной поток заблокирован по методу CountDownLatch#await, поэтому CountDownLatch#countDown не будет выполнен. Вы можете указать фоновый исполнитель для обратных вызовов (например, SingleThreadExecutor).

val retrofit = Retrofit.Builder()
        // options
        .callbackExecutor(Executors.newSingleThreadExecutor())
        // options
        .build()
...