Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

946
Visualizações
How to fix Kotlin JobCancellationException?

I got a crash because of Kotlin JobCancellationException.

The following is the detail about the crash :

kotlinx.coroutines.JobCancellationException: Job was cancelled; job=SupervisorJobImpl{Cancelling}@131dbe3     

All I know is the SupervisorJobImpl is for ViewModelScope, and it will be called method cancel when ViewModel lifecycle is over.

I was so confused about the Exception because Kotlin coroutines will just ignore the Exception, but it was thrown and cause the App crash. If it has stack I can just figure out, but it doesn't, just tell me that the job was cancelled.

I spent about more than 3 days on the exception but just have no idea.

I saw the video : KotlinConf 2019: Coroutines! Gotta catch 'em all! by Florina Muntenescu & Manuel Vivo, I found if the scope is canceled, and if you call await on a Deferred, it will throw the Exception, but I found no await on the canceled scope.

So can someone just show me some code which perhaps causes the same exception and make the App crash? Thx, there.

over 4 years ago · Hanz Gallego
7 Respostas
Responde à pergunta

0

Finally, I found what causes the Exception and the issue address is flowing:

kotlin.coroutines.channels.awaitClose: JobCancellationException

Actually, awaitClose will not throw the JobCancellationException, because awaitClose is a cancellable suspended function. The offer method will throw JobCancellationException if the Job was canceled because offer is not a cancellable suspended function.

By the way, callbackFlow is an experimental API, so it may cause some bug, so when we use it, we need to be careful. Because it will not always ignore JobCancellationException when Job was canceled, and I don't think it's friendly to developers.

Now I have found 2 situations that will cause JobCancellationException so we need to try catch the exception.

  1. async await, when we call the await method we need to try catch. And you can find and example in the Video.

  2. callbackFlow offer, when we call the offer method we need to try catch. And you can find an example in the issue above.

over 4 years ago · Hanz Gallego Relatório

0

I just saw the same problem. The issue was caused by the activity being finished manually before the job managed to complete.

over 4 years ago · Hanz Gallego Relatório

0

class MyApp: Application() {

    override fun onCreate() {
        super.onCreate()
        System.setProperty(DEBUG_PROPERTY_NAME, DEBUG_PROPERTY_VALUE_ON)
       
    }

in this way you will be able to pinpoint the main cause of the issue an deal with it

over 4 years ago · Hanz Gallego Relatório

0

I know I am late but you can just check Job Status before offering objects. Like this

if(isActive) offer(Resource.success(response))

isActive is Coroutine Scope

over 4 years ago · Hanz Gallego Relatório

0

I have the same bug as you. So I try to write simple flow extensions like below:

fun <P> Flow<DataResult<P>>.safeStart(start: suspend FlowCollector<DataResult<P>>.() -> Unit)
        : Flow<DataResult<P>> =  onStart {
        if (!currentCoroutineContext().isActive) return@onStart
        start()
    }

fun <P> Flow<DataResult<P>>.safeCatch(onCatch: suspend FlowCollector<DataResult<P>>.(cause: Throwable) -> Unit)
        : Flow<DataResult<P>> = catch {
        if (!currentCoroutineContext().isActive) return@catch
        onCatch(it)
}

suspend inline fun <P> Flow<DataResult<P>>.safeCollect(crossinline onCollect: suspend (value: DataResult<P>) -> Unit)
        : Unit = collect {
    if (!currentCoroutineContext().isActive) return@collect
    onCollect(it)
}
over 4 years ago · Hanz Gallego Relatório

0

I closed a ViewModel and a dialog and then started a Job. It led to this exception and HTTP-request cancellation: HTTP FAILED: java.io.IOException: Canceled.

close()
modelScope.launch {
    val response = withContext(Dispatchers.IO) {
        ...
    }
    response?.let { ... }
}

I simply moved close() to the end.

over 4 years ago · Hanz Gallego Relatório

0

Had the same crash when I used callbackFlow with offer with coroutines version 1.3.5. Now instead of offer I use trySend and it's fixed.

Note: trySend method is available (and offer is deprecated) when you update coroutines version to:

org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.0
over 4 years ago · Hanz Gallego Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda