android - 带有片段的协程作用域
问题描述
我有一个获取一些 LiveData 的网络调用。我的 Fragment 的生命周期所有者会观察 LiveData,因此 UI 更新是安全的。但是我进行的协程调用是否也需要限定在片段的生命周期所有者范围内?换句话说,我使用其中哪一个重要吗?
CoroutineScope(Dispatchers.IO).launch
或者
fragment.lifecycleScope.launch(context = Dispatchers.IO)
解决方案
CoroutineScope(Dispatchers.IO).launch{}
是一个CoroutineScope,它启动其中的所有协程并返回一个Coroutine Job。但是,如果您的活动/片段/视图模型被破坏,您需要调用cancel()
以停止此范围内所有已启动的协程。如果此后任何协程继续在后台运行,则可能导致内存泄漏。
fragment.lifecycleScope.launch(context = Dispatchers.IO){}
是一个生命周期感知协程范围,因此如果生命周期(活动/片段/视图模型)被销毁,则在此范围内启动的任何协程都会自动取消。
最好使用协程,lifecycleScope
这样您就不必管理协程作业的生命周期
推荐阅读
- reactjs - 有没有办法通过使用 HandleClick 来调用组件?
- javascript - dataLayer.push 函数未推送到 Google Analytics
- node.js - 当 postgres 安装在 google 实例中时,我对主机使用什么:在 postgres 数据库中?
- c++ - 在匿名命名空间中引用前向声明的函数?
- python-3.x - 如何纠正 Python 上的计算错误
- angular - 业力 | 离子 | 未捕获的错误:未捕获的错误:未捕获(承诺中):TypeError:无法读取未定义的属性“getToken”
- jquery - jQuery wrapAll 不适用于 WordPress
- javascript - 如果我的容器 div 中的任何 div 被点击,我将如何检查 javascript
- c# - 尝试使用另一个变量 C# 设置列表的容量
- php - MySQL 在 PHPMyAdmin 中运行,但 var_dump 在 PHP 中返回 null