是否可以在副作用运算符(doOnNext())中使用方法(返回Observable)?

时间:2018-02-10 07:18:55

标签: android rx-java rx-java2

我刚刚开始将RxJava引入我现有的项目中。

我有一个方法(在数据层中)用于名为getUser()的数据库操作,它返回Observable<User>。 我在3个不同的地方使用这种方法。在3个地方中,在2个地方我需要使用该方法返回Observable<User>。但是,我需要在doOnNext() 副作用运算符中访问此方法的地方出现问题。

AFAIK,doOnNext()不会改变流并继续前一个线程。如果流已经在io线程上,我们可以继续新的后台操作,而无需创建/使用Observable。

getDataManager().getUser(id)
                        .doOnNext(user -> getDataManager().insertUser(user))
                        .subscribeOn(getSchedulerProvider().io())
                        .observeOn(getSchedulerProvider().ui())
                        .subscribe()

这个insertUser()方法会返回Observable<Long>,这就是我想要的其他部分。但是对于这个副作用运算符我需要它只返回Long。

有什么方法可以删除Observable包装器吗?或者我需要创建两种不同的方法吗?

1 个答案:

答案 0 :(得分:2)

对于返回Observable的从属计算/ IO,一般使用flatMapconcatMap运算符。

getDataManager()
.getUser(id)
.concatMap(user ->
    getDataManager()
    .insertUser(user)
)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe()

如果您仍需要原始user,只需将其映射回来:

getDataManager()
.getUser(id)
.concatMap(user ->
    getDataManager()
    .insertUser(user)
    .ignoreElements()
    .andThen(Observable.just(user))
)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe()