有如此多的操作会同时进行,我们需要有一个更好的方法来管理它们的取消操作。也就是 Kotlin 的协程 (Coroutine)。
协程的优势
协程的优点主要来自三个方面:
- 很容易离开主线程。我们试过很多方法来让操作远离主线程,AsyncTask、Loaders、ExecutorServices……甚至有开发者用到了 RxJava。但协程可以让开发者只需要一行代码就完成这个工作,而且没有累人的回调处理。
- 样板代码最少。协程完全活用了 Kotlin 语言的能力,包括 suspend 方法。编写协程的过程就和编写普通的代码块差不多,编译器则会帮助开发者完成异步化处理。
- 结构并发性。这个可以理解为针对操作的垃圾搜集器,当一个操作不再需要被执行时,协程会自动取消它。
如何启动和取消协程
在 Jetpack 组件里,我们为各个组件提供了对应的 scope,比如 ViewModel 就有与之对应的 viewModelScope,如果您想在这个作用域里启动协程,使用如下代码即可:
class MainActivityViewModel : ViewModel {
init {
viewModelScope.launch {
// Start
}
}
}
如果您在使用 AppCompatActivity 或 Fragment,则可以使用 lifecycleScope,当 lifeCycle 被销毁时,操作也会被取消。代码如下:
class MyActivity : AppCompatActivity() {
override fun onCreate(state: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
// Run
}
}
}
有些时候,您可能还需要在生命周期的某个状态 (启动时/恢复时等) 执行一些操作,这时您可以使用 launchWhenStarted、launchWhenResumed、launch