我有一个网络电话获取一些LiveData。我的Fragment的生命周期所有者可以观察到LiveData,因此UI更新是安全的。但是我发出的协程调用是否也需要限制在片段的生命周期所有者身上?换句话说,我使用其中哪一个是否重要?
CoroutineScope(Dispatchers.IO).launch
或
fragment.lifecycleScope.launch(context = Dispatchers.IO)
答案 0 :(得分:1)
CoroutineScope(Dispatchers.IO).launch{}
是 CoroutineScope ,它启动其中的所有协程并返回 Coroutine Job 。
但是,如果您的活动/片段/视图模型被破坏,则需要调用cancel()
来停止此范围内所有已启动的协程。如果此后协程仍在后台运行,则可能导致内存泄漏。
fragment.lifecycleScope.launch(context = Dispatchers.IO){}
是生命周期感知的协同程序作用域,因此,如果销毁了生命周期(活动/片段/视图模型),则在此作用域中启动的任何协程都会自动取消。
最好将协程与lifecycleScope
一起使用,这样就不必管理协程作业