【问题标题】:How to obtain onComplete with Room Flowable<List<Item>>?如何使用 Room Flowable<List<Item>> 获取 onComplete?
【发布时间】:2020-01-18 13:07:15
【问题描述】:

我有一个使用 Room 来保存我的收藏夹的 Android 应用。

这是我的 DAO:

@Query("SELECT * FROM favorites ORDER BY lastConsultation DESC")
fun getAll() : Flowable<List<Favorite>>

我想使用 Flowable 让我的 MainActivity 在每次添加或删除收藏夹时都能收到通知。

在我的 MainActivity 上,我想检索我所有的收藏夹并发出网络请求以检查有关我收藏夹的一些信息。

在我的 UseCase 中,我有以下代码可以拨打电话

favoritesRepository.getAll()
        .flatMap { Flowable.just(it) }
        .concatMapEager { Flowable.fromIterable(it) }
        .concatMapEager {
            itemRepository.getItem(it.id)
                .toFlowable()
        }
        .toList()
        .toFlowable()

itemRepository 在调用getItem 时返回Single。我从我的favoritesRepository 检索Flowable&lt;List&lt;Favorite&gt;&gt; 并希望在发出网络请求后将每个收藏夹转入一个项目,我的方法返回一个Flowable&lt;List&lt;Item&gt;&gt;

我认为添加 .flatMap { Flowable.just(it) } 会创建一个新的 Flowable,一旦项目发出就会发出 onComplete(因为 Room 不会发出 onComplete)。

那段代码不起作用,永远不会调用 onComplete,因此也不会调用 .toList()

有没有一种方法可以实现这些调用(并发,因此 concatMapEager),同时保持我的 Flowable 实现(我可以使用 Single 来解决问题,但我会失去 MainActivity 上的“自动通知”)?

【问题讨论】:

    标签: android rx-java2 android-room


    【解决方案1】:

    我会假设realtyRepository 返回一个Single。试试这个。

    favoritesRepository
           .getAll()
           .switchMapSingle { Flowable
               .fromIterable(it)
               .concatMapEager { realtyRepository.getRealty(it.id).toFlowable() }
               .toList()
           }
    

    这将得到我理解你想要的,但当数据库更改时你仍然会收到通知。此外,switchMapSingle 将确保您正在进行的任何工作都将在同时发生任何数据库更新时被取消。

    【讨论】:

    • 您的假设是正确的,concatMapEager 中调用的存储库返回一个 Single。它与 switchMap 完美配合,这是我想用.flatMap { Flowable.just(it) } 完成的,但这不会创建新的可观察源。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多