Fragment中lifecycleScope与viewLifecycleOwner.lifecycleScope启动协程的优势对比
这两个协程作用域的绑定对象完全不同,适用场景差异极大,不存在绝大多数场景作用一致的情况,两者的特有优势分别如下:
1. lifecycleScope.launch {} 的特有优势
该作用域和 Fragment 实例本身的生命周期 绑定,协程会在 Fragment 执行 onDetach() (Fragment 完全销毁)时自动取消。
- 适用场景:所有和视图无关、和 Fragment 实例生命周期绑定的任务:比如 Fragment 初始化时拉取全局配置、监听不需要关联视图的全局数据流(比如用户登录状态变更)、横竖屏切换后不需要重建的持久任务
- 特有优势:不会因为 Fragment 视图销毁重建(比如切换底部导航栏切走 Fragment 再切回、横竖屏切换)就终止任务,避免重复执行冗余逻辑,降低资源消耗。
2. viewLifecycleOwner.lifecycleScope.launch {} 的特有优势
该作用域和 Fragment 的视图生命周期 绑定,协程会在 Fragment 执行 onDestroyView() (视图销毁)时自动取消。
- 适用场景:所有和视图操作相关的协程任务:比如请求接口后更新 UI、监听和视图绑定的数据流(比如列表数据变更后刷新 RecyclerView)、页面内动画相关的协程逻辑
- 特有优势:
- 规避视图销毁后执行 UI 操作导致的崩溃:比如接口请求返回时 Fragment 已经被切走,视图已经销毁,此时如果用 Fragment 本身的
lifecycleScope还会继续执行后续逻辑,调用控件方法就会触发空指针异常 - 视图重建时可自动重新执行对应逻辑:比如切走 Fragment 再切回后,和视图绑定的任务会重新执行,保证 UI 和数据状态一致,不会出现视图加载完成但没有刷新内容的问题。
- 规避视图销毁后执行 UI 操作导致的崩溃:比如接口请求返回时 Fragment 已经被切走,视图已经销毁,此时如果用 Fragment 本身的
注意:如果在
onViewCreated中用lifecycleScope订阅和 UI 相关的数据流,第一次进入页面时逻辑正常,切走 Fragment 再切回后会出现 UI 不刷新的问题:因为旧的订阅还在和已经销毁的视图绑定,新生成的视图没有对应的订阅逻辑。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

