关于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
相关产品推荐
相关产品推荐

