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()
我有一个方法,我想通过 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()