1

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

@Query("SELECT * from some_model ORDER BY some_field")
fun getData(): Flow<List<some_model>>

据我所知,Flow 就像一种“异步序列”,所以我真的没有理解“Flow<List< T >>”的含义。

为什么我们不能直接使用 Flow< T > 这对我来说似乎很直观,我问这个问题是因为我在代码片段中看到了多次重复并且无法理解其背后的目的?

4

1 回答 1

2

当我开始使用Flow.

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

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

dao.getData().collect { list ->
    Log.d(TAG, list.joinToString())
}

然后您更改数据库:

dao.insert(...)
dao.insert(...)

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

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

于 2020-07-20T00:52:14.273 回答