You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于RxJava Flowable累积输出列表及Room数据库的技术问询

问题1:配置Flowable实现逐个追加的列表输出

你要的效果可以通过RxJava的scan操作符实现,它能帮你累积已发射的元素,每次输出包含当前所有元素的列表,同时配合switchMap保证查询变更时切换到新的流。

修改后的代码如下:

override fun observeGroupsBySearchQuery(query: String): Flowable<List<Group>> {
    return groupsDao.observeGroupsBySearchQuery(query)
        .switchMap { entityList ->
            Flowable.fromIterable(entityList)
                .map { groupEntity ->
                    Group(groupEntity.symbol, groupEntity.number, groupEntity.name)
                }
                // 用scan累积元素,初始值为空列表,每次把新元素追加进去
                .scan(emptyList<Group>()) { accumulatedList, newGroup ->
                    accumulatedList + newGroup
                }
                // 跳过初始的空列表(不需要的话可移除)
                .skip(1)
        }
}

说明:

  • scan操作符会维护一个累积列表,每收到一个新元素就将其追加到列表末尾,然后发射这个更新后的列表,这样就能依次输出包含1个、2个、3个……元素的列表。
  • switchMap会在查询query变更时自动取消之前的流,订阅新的查询结果流,满足“搜索查询变更时返回新列表”的需求。
  • 如果希望一开始先发射空列表,去掉skip(1)即可。

问题2:Room数据库能否逐行返回查询结果,是否必须用分页?

Room完全可以逐行返回查询结果,不需要必须用分页。

只需把DAO方法的返回类型从Flowable<List<GroupsEntity>>改成Flowable<GroupsEntity>:

@Query(
    value = """
    SELECT * 
    FROM Groups 
    WHERE symbol || number || name LIKE '%' || :query || '%' AND number != -1 AND active IS 1
    """
)
abstract fun observeGroupsBySearchQuery(query: String): Flowable<GroupsEntity>

这样Room会逐个发射查询结果中的每一行数据,而非一次性返回整个列表。

如果查询结果数据量极大,逐行发射可能导致内存占用过高或UI卡顿,这种情况下用分页(比如Room的LIMIT+OFFSET或Paging3库)是更优的性能选择,但这属于优化手段,不是强制要求。

内容的提问来源于stack exchange,提问作者Jacek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:35:19