我正在尝试获取消息映射,其作者 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] 删除。
我来说两句