首页 > 解决方案 > 带有片段的协程作用域

问题描述

我有一个获取一些 LiveData 的网络调用。我的 Fragment 的生命周期所有者会观察 LiveData,因此 UI 更新是安全的。但是我进行的协程调用是否也需要限定在片段的生命周期所有者范围内?换句话说,我使用其中哪一个重要吗?

CoroutineScope(Dispatchers.IO).launch

或者

fragment.lifecycleScope.launch(context = Dispatchers.IO)

标签: androidkotlin-coroutines

解决方案


CoroutineScope(Dispatchers.IO).launch{}是一个CoroutineScope,它启动其中的所有协程并返回一个Coroutine Job。但是,如果您的活动/片段/视图模型被破坏,您需要调用cancel()以停止此范围内所有已启动的协程。如果此后任何协程继续在后台运行,则可能导致内存泄漏。

fragment.lifecycleScope.launch(context = Dispatchers.IO){}是一个生命周期感知协程范围,因此如果生命周期(活动/片段/视图模型)被销毁,则在此范围内启动的任何协程都会自动取消。

最好使用协程,lifecycleScope这样您就不必管理协程作业的生命周期


推荐阅读