Ananiya
08/26/2021, 9:15 AMinvokeOnCompletion
even after I surround it within coroutine
liveData {
val mainJob = viewModelScope.launch {
emit(Result.LOADING)
repo.add(data)
}
mainJob.join()
mainJob.invokeOnCompletion {
viewModelScope.launch {
if(it != null) emit(Result.FAILED(it) else emit(Result.SUCCESS(null)
}
}
}
Alternatively if I do
liveData {
val mainJob = viewModelScope.launch {
emit(Result.LOADING)
repo.add(data)
emit(Result.SUCCESS(null)
}
mainJob.join()
}
But I need to handle if it complete with in failure or successNick Allen
08/26/2021, 5:38 PMliveData
coroutine has finished so emit
is throwing a CancellationException.
I'd suggest avoiding viewModelScope from inside a liveData
lambda. You can just do:
liveData {
coroutineScope {
val mainJob = launch {
emit(Result.LOADING)
repo.add(data)
}
mainJob.join()
mainJob.invokeOnCompletion {
launch {
if(it != null) emit(Result.FAILED(it)) else emit(Result.SUCCESS(null))
}
}
}
}
to get it working.Nick Allen
08/26/2021, 5:42 PMliveData {
emit(Result.LOADING)
try {
repo.add(data)
emit(Result.SUCCESS(null)
} catch (t: Throwable) {
emit(Result.FAILED(t)
throw t
}
}
Ananiya
08/28/2021, 6:37 AM