Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to name coroutine in Android?

As per the documentation, we can name coroutine using CoroutineName("theName")

If I run it without the name (in the unit-test)

        runBlocking {
            launch { 
                println("main runBlocking pre       : ${Thread.currentThread().name}:${coroutineContext[Job]}")
                delay(500)
                println("main runBlocking post      : ${Thread.currentThread().name}:${coroutineContext[Job]}")
            }

Both the Thread.currentThread().name and coroutineContext[Job] will assign an ID to the coroutine name, hence the print out as below (notice coroutine#2)

main runBlocking pre       : main @coroutine#2:"coroutine#2":StandaloneCoroutine{Active}@39529185
main runBlocking post      : main @coroutine#2:"coroutine#2":StandaloneCoroutine{Active}@39529185

If I run it with the name (in the unit-test)

        runBlocking {
            launch(CoroutineName("CustomName")) { 
                println("main runBlocking pre       : ${Thread.currentThread().name}:${coroutineContext[Job]}")
                delay(500)
                println("main runBlocking post      : ${Thread.currentThread().name}:${coroutineContext[Job]}")
            }

It will print (notice the @CustomName#2)

main runBlocking pre       : main @CustomName#2:"CustomName#2":StandaloneCoroutine{Active}@78e117e3
main runBlocking post      : main @CustomName#2:"CustomName#2":StandaloneCoroutine{Active}@78e117e3

However, if I run it in Android as below

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        runBlocking {
            launch(CoroutineName("CustomName")) { // context of the parent, main runBlocking coroutine
                Log.d("Track", "main runBlocking pre       : ${Thread.currentThread().name}:${coroutineContext[Job]}")
                delay(500)
                Log.d("Track", "main runBlocking post      : ${Thread.currentThread().name}:${coroutineContext[Job]}")
            }
        }
    }

It prints

Track: main runBlocking pre       : main:StandaloneCoroutine{Active}@5e322c2
Track: main runBlocking post      : main:StandaloneCoroutine{Active}@5e322c2

The coroutine name is not given, nor is the coroutine assigned ID. I can only identify from the address ID i.e. @5e322c2, which is not guaranteed to be the same always.

How can I assign the coroutine name in Android?

like image 343
Elye Avatar asked Nov 06 '22 03:11

Elye


1 Answers

The coroutine name is only used in debugging mode. However, you can enable in your application:

System.setProperty("kotlinx.coroutines.debug", "on" )
like image 78
Diniz Avatar answered Nov 14 '22 22:11

Diniz