Android Room数据库RxJava平面图链请求

时间:2018-11-17 08:47:36

标签: android rx-java android-room flatmap

我正试图获得一对:

Pair<User,List<Messages>>

我阅读了这篇文章:RxJava patterns

我基本上尝试先吸引用户。然后,一旦有了用户,我就想要获取该用户的所有消息:

mDisposable.add(
                userViewModel.getUser(id)
                .flatMap(user -> messagesViewModel.getFromUser(user.getId()),(user, messages) -> new Pair<>(user, messages)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(//update view based on user and messages);

代码不起作用,它抱怨传递给flatmap的参数。

  • userViewModel.getUser(id)返回一个Single<User>
  • messagesViewModel.getFromUser(user.getId())返回一个Single<List<Message>>

flatmap的rx文档和方法定义非常混乱。我该如何实现?还是有另一种方法可以做到这一点?

有趣的是,它似乎可以与Observable一起使用:

mDisposable.add(
                Observable.just(1)
                .flatMap(item -> Observable.just(2), Pair::new)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe());

1 个答案:

答案 0 :(得分:1)

根据文档,Observable具有flatMap()功能,其签名类似

public final <U,R> Observable<R> flatMap(Function<? super T,? extends ObservableSource<? extends U>> mapper,
    BiFunction<? super T,? super U,? extends R> resultSelector)

这正是您在最新情况下使用的。但是Single只有flatMap()带有签名,例如

public final <R> Single<R> flatMap(Function<? super T,? extends SingleSource<? extends R>> mapper)

这就是为什么您不能直接使用它的原因。如果您仍然想使用Single来解决问题,则可以使用下一个表达式

userViewModel.getUser(id)
    .flatMap(user -> messagesViewModel.getFromUser(user.getId())
                             .map(messages -> new Pair<>(user, messages)))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())