-
-
Save chrisbanes/a9453de76c1e7dc54573a6e5bb765545 to your computer and use it in GitHub Desktop.
open class ScopedViewModel : ViewModel() { | |
private val job = Job() | |
protected val scope: CoroutineScope = job + Dispatchers.Main | |
override fun onCleared() { | |
super.onCleared() | |
job.cancel() | |
} | |
} |
class DetailViewModel : ScopedViewModel() { | |
fun startTask() { | |
scope.launch { | |
// Switch the 'background' thread | |
withContext(Dispatchers.Default) { | |
// do your long-running thing | |
} | |
// We're now back on the Android's Main thread (since we're using | |
// the ScopedViewModel's scope) | |
updateUi() | |
} | |
} | |
} |
@XinyueZ UI
is deprecated in favour of Dispatchers.Main
. And since he set that as the coroutine context for theViewModel
, launch
uses that by default.
That being said, I prefer the default dispatcher to be Dispatchers.Default
and switch to the main (or IO, but this shouldn't be necessary with the experimental scheduler) context when necessary.
I C, got it, I have converted my project from experimental to non-experimental and I have seen a lot different things.
I prefer
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
private val scope: CoroutineScope = job + Dispatchers.Main
doesn't compile... it expect a CoroutineScope
Yes, it doesn't compile, I have solved it like this:
protected val scope: CoroutineScope = CoroutineScope(Dispatchers.Main + job)
Great stuff!
Is it ok implement CoroutineScope from viewModel and just use launch instead of scope.launch?
launch // no launch(ui){...} ?