android - Android Leakcanary 使用 Flow 泄漏,而使用 LiveData 没有泄漏
问题描述
如果我使用Flow
,泄漏金丝雀显示泄漏。将该流转换为LiveData
使用asLiveData()
没有泄漏。
当我的应用程序启动时,viewmodel
我正在执行以下操作:
itemsRepository
.getLatestItems() //Does a network request to get the latest items
.flowOn(Dispatchers.IO)
.onStart { .... }
.onEach { .... }
.catch { .... . }
.onCompletion { .... }
.launchIn(viewModelScope)
Leak Canary 显示了这一点:
→ xxx.xxxxxx.xxxxx.xxxx.ItemsViewModel instance
Leaking: YES (ObjectWatcher was watching this because xxx.xxxxxx.xxxxx.
ItemsViewModel received ViewModel#onCleared() callback)
Retaining 3.1 kB in 101 objects
key = 66b151b2-fffb-4db9-91ec-716b456112ea
watchDurationMillis = 11427
retainedDurationMillis = 6427
现在,如果我将代码更改为:
itemsRepository
.getLatestItems() //Does a network request to get the latest items
.asLiveData()
.observeForever { ... }
泄漏金丝雀现在并没有说我有泄漏。
知道为什么Flow
用作泄漏Livedata
而不使用吗?由于在.launchIn(viewModelScope)
取消视图模型范围时启动了流程,所以不应该释放对象吗?
解决方案
推荐阅读
- c# - 从实体框架 SqlQuery 访问未映射的实体
- c# - WebClient 下载后正在使用的文件
- c# - .net core 2.x 的 UI
- javascript - JavaScript onclick 可见/隐藏 div - 我该如何解决这个问题?
- javascript - 如何通过数组中xy坐标给出的点画一条线?
- command-line - Lilypond:跳过标题(命令行)
- python - 多级组和重复检查
- javascript - 如何通过其中包含 javascript 的 mongo_go_driver 运行聚合查询?
- python - 正则表达式匹配精确单词
- mysql - 在 MAC .bash 文件中运行 MySQL 语句