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.TagLost
reactormonk
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 PMcardScope
uli
11/01/2023, 4:24 PMcardScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
reactormonk
11/01/2023, 4:25 PM