首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用Flow<T>而使用Flow<List<T>>?

不使用Flow<T>而使用Flow<List<T>>?
EN

Stack Overflow用户
提问于 2020-07-20 00:57:28
回答 1查看 61关注 0票数 1

我注意到很多人和例子使用流作为List<>的包装器,例如:

代码语言:javascript
复制
@Query("SELECT * from some_model ORDER BY some_field")
fun getData(): Flow<List<some_model>>

因为我知道流程就像是一种“异步序列”,所以我真的不明白"Flow>“的含义。

为什么我们不能直接使用Flow< T>,这对我来说似乎很直观,我之所以问这个问题,是因为我在代码片段中看到过很多次重复这个问题,不明白它背后的目的??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-20 08:52:14

这也是我刚开始使用Flow时问自己的问题。

您可能认为,使用Flow with Room首先会从查询中提取部分数据,使数据在从数据库中获得时通过流可用。这将有效地使用像Flow<T>这样的东西。然而,这不是这里的想法,这更多的是你可以通过Paging得到的东西。

相反,当您调用getData()时,您将获得一个Flow<List<T>>,它将在每次查询结果更改时发出一个完整的新列表,以及一个初始值。SELECT语句总是生成带有房间的列表,而不是单个值。因此,假设您在一个地方收集流:

代码语言:javascript
复制
dao.getData().collect { list ->
    Log.d(TAG, list.joinToString())
}

然后更改数据库:

代码语言:javascript
复制
dao.insert(...)
dao.insert(...)

将写入3条日志消息,一条用于初始值,两条用于后续更改。这一开始可能看起来效率很低(这就是为什么我一开始并不真正理解它的原因),但在实践中,对大多数设备的性能影响可以忽略不计,即使有数千行。当与ListAdapter和DiffUtil结合使用时,它允许一个非常干净的列表实现。

我希望这回答了你的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62983215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档