CountDownLatch 在 Android 上冻结线程

CountDownLatch freezes thread on Android

我有一个方法,我想通过 API 调用 Retrofit 检查我的令牌的有效性,我想等待结果。我想使用 CountDownLatch,但似乎 countDownLatch.await() 锁定了线程并且没有任何反应,调试器没有到达 onResponse 部分。我用 Postman 检查了我的 API,电话确实打通了。

我也发现了这个问题,它与我的问题类似,但没有帮助:

    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

我是不是用错了什么或者有没有其他方法可以获得所需的功能?

Retrofit Callback 文档说:

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()