kotlin: 协程作用域
一,常见的协程作用域
协程的作用域用于统一管理协程,包括跟踪所有协程和取消所有协程。
常见的协程作用域有:
- GlobalScope:它是一种顶级协程。生命周期是进程级别的,只要应用进程还在运行,即使 Activity 或 Fragment 被销毁,此作用域下的协程仍然会执行。
- MainScope:只能在 Activity 中使用,使用 MainScope 时,需要在 onDestroy 中调用 cancel() 取消协程。
- viewModelScope,只能在 ViewModel 中使用,它会绑定 ViewModel 的生命周期
- lifecycleScope,只能在 Activity、Fragment 中使用,它会绑定 Activity 和 Fragment 的生命周期。
二,例子一: MainScope
class MainActivity : AppCompatActivity() {
private val mainScope = MainScope()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainScope.launch {
// do something
}
}
override fun onDestroy() {
super.onDestroy()
mainScope.cancel()
}
}
也可以使用 Kotlin 中的 by 关键字,通过代理模式将 MainActivity 变成 MainScope:
class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
launch {
// do something
}
}
override fun onDestroy() {
super.onDestroy()
cancel()
}
}
三,例子二:
class MainViewModel() : ViewModel() {
// 在布局文件中配置的属性
val student = MutableLiveData<Student>()
// 该方法用于刷新数据
fun setStudentData() {
viewModelScope.launch {
student.value = Student("Tom", 18)
}
}
}
data class Student(val name: String, val age: Int)