reactormonk
10/31/2023, 4:39 PMwhen (cardMessage) {
is CardMessage.TagLost -> {
cardScope.cancel("Card left field")
}
else -> {
cardScope = CoroutineScope(Dispatchers.Default)
}
}uli
11/01/2023, 3:54 PMCardMessage.TagLostreactormonk
11/01/2023, 3:54 PMTagLost after each card message.reactormonk
11/01/2023, 3:54 PMSupervisorJob, would that also work?uli
11/01/2023, 3:56 PMreactormonk
11/01/2023, 3:57 PMcardScope, better use a cardJob and use SupervisorJob to create that.uli
11/01/2023, 3:59 PMcardScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)reactormonk
11/01/2023, 4:00 PMuli
11/01/2023, 4:01 PMcardScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
when (cardMessage) {
is CardMessage.TagLost -> {
cardJob.cancel("Card left field")
}
else -> {
cardJob = cardScope.launch() { /* Do some work */ }
}
}reactormonk
11/01/2023, 4:02 PMcardJob = SupervisorJob()uli
11/01/2023, 4:03 PMreactormonk
11/01/2023, 4:03 PMreactormonk
11/01/2023, 4:05 PMcardJob = SupervisorJob() and then cancel the cardJob, so it'll stop all coroutines inside the cards?uli
11/01/2023, 4:06 PMreactormonk
11/01/2023, 4:06 PMCoroutineScope(Dispatchers.Default + cardJob)reactormonk
11/01/2023, 4:07 PMuli
11/01/2023, 4:07 PMreactormonk
11/01/2023, 4:07 PMuli
11/01/2023, 4:07 PMpublic fun CoroutineScope.cancel(cause: CancellationException? = null) {
val job = coroutineContext[Job] ?: error("Scope cannot be cancelled because it does not have a job: $this")
job.cancel(cause)
}uli
11/01/2023, 4:08 PMreactormonk
11/01/2023, 4:09 PMSupervisorJob()?uli
11/01/2023, 4:09 PMuli
11/01/2023, 4:09 PMuli
11/01/2023, 4:10 PMreactormonk
11/01/2023, 4:10 PMcardScope
b) I want a coroutine being cancelled not kill everything on cardScope
To achieve that, use cardScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)?uli
11/01/2023, 4:18 PMreactormonk
11/01/2023, 4:19 PMuli
11/01/2023, 4:20 PMwhen (cardMessage) {
is CardMessage.TagLost -> {
cardJob.cancel("Card left field")
}
else -> {
cardJob = cardScope.launch() { /* Do some work */ }
}
}
Here you only cancel the job of that one coroutine. cardScope will be unaffected and can be reused for the next coroutineuli
11/01/2023, 4:20 PMreactormonk
11/01/2023, 4:21 PMcardScope.launch { }, after passing cardScope aroundreactormonk
11/01/2023, 4:21 PMuli
11/01/2023, 4:21 PMreactormonk
11/01/2023, 4:22 PMuli
11/01/2023, 4:23 PMb) I want a coroutine being cancelled not kill everything oncardScope
reactormonk
11/01/2023, 4:24 PMcardScopeuli
11/01/2023, 4:24 PMcardScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)reactormonk
11/01/2023, 4:25 PM