nagym08
nagym08

Reputation: 75

CountDownLatch freezes thread on Android

I have a method, where I would like to check the validity of my token through an API call with Retrofit and I want to wait for the result. I thought to use CountDownLatch but it seems countDownLatch.await() locks the thread and nothing happens, the debugger doesn't get to the onResponse part. I checked my API with Postman, the call actually hits it.

I also found this question which is similar to my problem but it didn't help: CountDownLatch not freeing thread

    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

Do I use anything wrong or is there any other way the get the desired function?

Upvotes: 0

Views: 1477

Answers (1)

Akaki Kapanadze
Akaki Kapanadze

Reputation: 2672

The Retrofit Callback documentation says:

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

The main thread is blocked on the method CountDownLatch#await, so CountDownLatch#countDown will not be executed. You can specify a background executor for the callbacks to run on (for example SingleThreadExecutor).

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

Upvotes: 2

Related Questions