RxJava toMultiMap 不适用于房间数据库查询

弗拉克

我正在尝试获取消息映射,其作者 ID 键如下所示:

Map<Long, Collection<Message>>

这是我尝试过的:

messageViewModel.getAll()
                    .flatMap(Flowable::fromIterable)
                    .toMultimap(Message::getAuthorId)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(this::onSuccess);

private void onSuccess(Map<Long, Collection<Message>> longCollectionMap) {
    Collection<Message> messages = longCollectionMap.get(0);
}

方法 messageViewModel.getAll() 返回:

Flowable<List<Message>>

然后我将它转换为 Flowable 流(Flowable::fromIterable),这样它就可以一次发射一个项目而不是整个列表,然后我用“toMultiMap”进行映射

从未调用过 onSuccess 方法,我不知道这里出了什么问题。如果我不使用 toMultiMap(并对代码进行相应的修改)它可以工作,那么问题一定是 toMultiMap 方法。

但是当我尝试这个时:

List<String> list = Arrays.asList("1", "2", "3");
Flowable.fromIterable(list)
                    .toMultimap(String::length)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(this::onSuccess);

 private void onSuccess(Map<Integer,Collection<String>> integerCollectionMap) {
    Collection<String> strings = integerCollectionMap.get(1);
}

这有效!唯一的区别是这个不调用房间数据库来获取可迭代的项目。

文档还说:

请注意,此运算符要求上游向 {@code onComplete} 发出信号以发出累积地图。

这让我很困惑。由于 Flowable 类没有以 onComplete 作为参数的 subscribe 方法,并且它没有用于我上面展示的第二种情况,但它可以工作。

请帮助我,这让我发疯。

弗拉克

我为遇到相同或类似问题的任何人找到了解决方案。

首先,我必须调试以查看映射是否实际完成或根本没有完成。为此,我只是从 toMultiMap 方法开始调试它。然后我发现映射实际上已经完成了,所以问题是结果没有返回。

阅读有关 RxJava 的更多信息,我意识到了问题的原因。第一次调用:

messageViewModel.getAll()

回来了

Flowable<List<Message>>

这意味着此源将发出 0 到 n 个元素,在本例中为“消息列表”。事实上,它发出了 Message 列表,之后映射就完成了。但它没有返回任何东西,因为它正在等待更多的“列表”从源中出现。

您必须记住 Flowable 或 Observable 可能会发出无限元素。与执行 Flowable.fromIterable 的区别在于 fromIterable 将停止,或在发出作为参数传递的可迭代对象的最后一个元素后发出流结束的信号,这意味着方法调用序列的其余部分将不会等待更多元素来,结果将被返回。

所以解决方案是将 messageViewModel.getAll() 的返回类型更改为:

Single<List<Message>>

所以现在它会发出 1 个项目、消息列表或错误。因此,在发出一个元素后,不会再有元素出现,链上的其他方法将执行并返回值。

但是“toMultiMap”方法不适用于“Single”,Single 类上没有这样的东西。所以你必须把它转换成一个可流动的,所以我这样做了:

.flatMapPublisher(Flowable::fromIterable)

所以最后的代码是这样的:

messageViewModel.getAll() //Returns Single<List<Message>>
                .flatMapPublisher(Flowable::fromIterable) // Creates a flowable from List<Message>
                .toMultimap(Message::getAuthorId)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(this::onSuccess);

非常漂亮和干净的代码,需要一些时间来理解反应式方法的工作原理,但绝对值得。希望有人觉得这很有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

房间数据库多列子查询

来自分类Dev

如何在房间数据库中触发两个查询

来自分类Dev

房间数据库,用列表构建和查询实体

来自分类Dev

Rxjava:插入仅适用于单个但不适用于可填充

来自分类常见问题

加入房间数据库收藏夹

来自分类Dev

从LiveData填充微调器(房间数据库)

来自分类Dev

使用 kotlin 的房间数据库

来自分类Dev

实现房间数据库 (Android)

来自分类Dev

添加到房间数据库

来自分类Dev

从房间数据库中删除实体

来自分类Dev

多模块项目中的房间数据库

来自分类Dev

数据在房间数据库显示,从服务器中删除后,即使

来自分类Dev

改造成功后,协程问题将数据插入房间数据库

来自分类Dev

房间数据库。插入成功,但未找到数据

来自分类Dev

插入数据后房间数据库表还是空的

来自分类Dev

从房间数据库中获取当前周和月的数据

来自分类Dev

Golang-Postgres ..关闭数据库连接不适用于特定查询

来自分类Dev

流变量不适用于数据库选择查询

来自分类Dev

Ruby on Rails 数据库查询不适用于heroku

来自分类Dev

显示错误,而在房间数据库中插入用户

来自分类Dev

如何从房间数据库中获取多个计数?

来自分类Dev

房间数据库中GROUP BY语句的返回类型

来自分类Dev

如何在房间数据库中将列名作为参数传递?

来自分类Dev

即使房间数是最大数,该值仍存储在数据库中

来自分类Dev

在房间数据库中使用列表存储模型对象

来自分类Dev

房间数据库中的自定义对象数组

来自分类Dev

Android Studio:如何让房间数据库自动生成记录 ID?

来自分类Dev

房间数据库不考虑类型转换器

来自分类Dev

如何在房间数据库中加入多个表

Related 相关文章

热门标签

归档