-
-
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){...} ?