首页 > 解决方案 > 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)取消视图模型范围时启动了流程,所以不应该释放对象吗?

标签: androidmemory-leaksleakcanary

解决方案


推荐阅读