首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CountDownLatch冻结Android上的线程

CountDownLatch冻结Android上的线程
EN

Stack Overflow用户
提问于 2019-05-05 15:45:52
回答 1查看 967关注 0票数 0

我有一个方法,在这个方法中,我希望通过一个API调用来检查我的令牌的有效性,并且我希望等待结果。我想使用CountDownLatch,但似乎countDownLatch.await()锁定了线程,什么都没有发生,调试器没有到达onResponse部分。我和邮递员检查了我的API,这个电话真的打到了。

我还发现了一个类似于我的问题的问题,但它没有帮助:CountDownLatch不释放线程

代码语言:javascript
复制
    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

我是否使用了任何错误,或者是否有其他方法获得所需的函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-05 22:37:15

Retrofit 回调文档说:

代码语言:javascript
复制
Callbacks are executed on the application's main (UI) thread.

主线程在方法CountDownLatch#await上被阻塞,因此不会执行CountDownLatch#countDown。您可以为要运行的回调指定后台执行器(例如,SingleThreadExecutor)。

代码语言:javascript
复制
val retrofit = Retrofit.Builder()
        // options
        .callbackExecutor(Executors.newSingleThreadExecutor())
        // options
        .build()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55993728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档