GlobalScope的问题
我们在Activity或Fragment中使用协程时,要尽量避免使用GlobalScope
。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
GlobalScope.launch {
val data = withContext(Dispatchers.IO) {
loadData()
}
initUi(data)
}
}
...
}
GlobalScope
是生命周期是process级别的,所以上面的例子中,即使Activity或Fragment已经被销毁,协程仍然在执行。
解决方法
使用androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha01
或更高版本,会用LifecycleScope
代替GlobalScope
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
lifecycleScope.launch {
val data = withContext(Dispatchers.IO) {
loadData()
}
initUi(data)
}
}
...
}
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val data = withContext(Dispatchers.IO) {
loadData()
}
initUi(data)
}
}
...
}
参考 https://developer.android.com/topic/libraries/architecture/coroutines