Android 房间数据库 RxJava 平面图链请求

Android Room database RxJava flatmap chain requests

我想买一双:

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 的参数。

flatmap 的 rx 文档和方法定义非常混乱。我怎样才能做到这一点?还是有其他方法可以做到这一点?

有趣的是它似乎与 Observable 一起工作:

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

根据文档,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解决问题,你可以用next expression

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