Ada*_*m J 5 stream sequence rx-java2
我正在尝试从RxJava1迁移到RxJava2.我更换所有的部分代码,我以前有Observable<Void>来Compleatable.但是我遇到了一个流调用顺序的问题.当我以前处理Observables并使用map和flatMaps时,代码按预期工作.然而,andthen()运营商似乎有点不同.这是一个简化问题本身的示例代码.
public Single<String> getString() {
Log.d("Starting flow..")
return getCompletable().andThen(getSingle());
}
public Completable getCompletable() {
Log.d("calling getCompletable");
return Completable.create(e -> {
Log.d("doing actuall completable work");
e.onComplete();
}
);
}
public Single<String> getSingle() {
Log.d("calling getSingle");
if(conditionBasedOnActualCompletableWork) {
return getSingleA();
}else{
return getSingleB();
}
}
Run Code Online (Sandbox Code Playgroud)
我最后在日志中看到的是:
1-> Log.d("Starting flow..")
2-> Log.d("calling getCompletable");
3-> Log.d("calling getSingle");
4-> Log.d("doing actuall completable work");
Run Code Online (Sandbox Code Playgroud)
正如你可能想到的那样,我希望在第3行之前调用第4行(之后andthen()运算符的名称表明代码将在'Completable完成它的工作之后被调用').以前我是创造了Observable<Void>使用Async.toAsync()运营商和现在被称为该方法getSingle是在flatMap流-它的工作就像我预期,所以登录前4 3.现在我试图改变Compleatable的创建方式会出现-如使用fromAction或fromCallable但它的行为相同.我也找不到任何其他操作员来替换andthen().要强调 - 该方法必须是可完成的,因为它没有任何意义完全返回的东西 - 它会更改应用程序首选项和其他设置(并且像全局主要使用'正常预期'那样使用)并且稍后需要这些更改在溪流中.我还尝试将getSingle()方法换行以某种方式创建一个Single并在create块中移动if语句,但我不知道如何在其中使用getSingleA/B()方法.我需要使用它们,因为它们有自己的复杂性,复制代码没有意义.任何人都知道如何在RxJava2中修改它,所以它的行为相同?在继续使用流之前,我依赖多个可依赖可完成作业的地方(如刷新会话令牌,更新数据库,首选项等等 - 使用flatMap在RxJava1中没有问题).
您可以使用延迟:
getCompletable().andThen(Single.defer(() -> getSingle()))
Run Code Online (Sandbox Code Playgroud)
这样,您不会getSingle()立即执行 的内容,而是仅在Completable完成并andThen切换到Single.
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |