关于协程启动的选择
常规启动方式
1.coroutineScope 使用在一个独立的模块或其他服务请求任务关联后者影响较小时开启一个子作用域, 例如一个独立的服务请求和子系统任务处理 。可在任何地方开启,调用cancel来取消
fun getBanner() {
CoroutineScope(Dispatchers.IO).launch {
val respData = RepositoryFactory.getBanner()
when (respData.respCode) {
RespCode.SUCCESS -> bannerFlow.value = respData.data
RespCode.FAIL -> errorFlow.value = respData.errorMsg
RespCode.SERVICE -> serviceFlow.value = respData.error
}
}
}
2.GlobalScope 作用域为整个APP,LOG存储,上传之类
GlobalScope.launch {
// 在应用程序的生命周期内启动一个新的协程并继续
delay(1000L)
// 非阻塞的等待1秒钟
println("World!")
}
3.lifecycleScope 绑定与Activity
//activity 推荐使用开启协程
lifecycleScope.launch {
}
4.viewLifecycleOwner.lifecycleScope 绑定fragment 的onCreateView()到 onDestroyView()。
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
vm.bannerFlow.collect {
// update UI
tv_h.text = it.toString()
}
}
}
使用位置
Activity 启动
lifecycleScope 绑定Activity、Fragment的整个生命周期onCreate()到onDestroy()这个范围的生命周期(推荐)。
Fragment
viewLifecycleOwner.lifecycleScope 绑定fragment 的onCreateView()到 onDestroyView()这个范围的生命周期(推荐)。
lifecycleScope也可使用但绑定的是onCreate()到onDestroy(),view销毁,会导致crash。
绑定ViewModel
viewModelScope. 只能在ViewModel中使用,绑定ViewModel的生命周期.
参考:
https://juejin.cn/post/7395523104743096359
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。