gpt4 book ai didi

java - RxJava 2 - 在另一个 Completable 之后调用 Completable

转载 作者:行者123 更新时间:2023-12-02 11:23:58 27 4
gpt4 key购买 nike

我是 RxJava 的新手,遇到了以下问题:

我有两个 Completable 对象来存储一些数据。我想触发第一个,然后仅在第一个成功完成后才启动第二个。对第二个 Completable 的调用应该被阻止,直到第一个 Completable 成功完成。另外,如果第一个已完成并出现错误,则也应跳过另一个。

查看文档和其他问题,似乎 concatWithandThen 应该适合我。但在手动测试和单元测试中,我可以看到第二个可完成的任务与第一个任务并行触发:/

首次完成

public Completable doA() {
Log.d(TAG, "class call");

return db.countRows()
.doOnSuccess(integer -> {
Log.d(TAG, "found rows: "+integer);
})
.doOnError(Throwable::printStackTrace)
.flatMapCompletable(this::customAction);
}

private Completable customAction(final int count) {
Log.d(TAG, "count: "+count);
if (count > 0) {
Log.d(TAG, "no rows, skip");
return Completable.complete();
}

final User user = ...
return db.save(user); // return Completable
}

第二个完成

public Completable doB() {
Log.d(TAG, "call to B");
// ...
}

尝试在 A 之后调用 B

public Completable someMethod() {
Log.d(TAG, "someMethod");
return doA()
.andThen(doB());
// this also doesn't work
//.concatWith(doB());
}

订阅

someMethod()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnComplete(() -> {
Log.d(TAG, "complete");
// ...
})
.doOnError(throwable -> {
Log.d("Main", "error "+throwable.getMessage());
// ...
})
.subscribe();

当我运行我的应用程序并检查日志时,我可以看到:

D/Some method: some method
D/DoA: class call
D/DoB: class call // <- why here?
D/DoA: found rows: 0
D/DoA: count: 0

以下单元测试也失败:

@Test
public void test() {
when(doa.doA()).thenReturn(Completable.error(new Exception("test")));

observe(); // subscription with TestObserver

verify(dob, never()).doB(); // fails with NeverWantedButInvoked
}

我错过了什么?

最佳答案

因为你调用了doB()。让我重写您的流程:

public Completable someMethod() {
Log.d(TAG, "someMethod");

// doA() inlined
LOG.d("class call");
Completable a = ...

// doB() inlined
Log.d("class call");
Completable b = ...

return a.andThen(b);
}

关于java - RxJava 2 - 在另一个 Completable 之后调用 Completable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851516/

27 4 0