android - AndThen 在可完成完成之前执行

标签 android rx-java rx-kotlin

让我们来看两个用 Rx 编写的方法:

Maybe<Foo> getFooFromLocal
Single<Foo> getFooFromNetwork

我想在检查本地存储的Foo 时编写一个链。如果我们没有任何 Foo,我们应该从网络中获取它,然后将其保存到本地存储,然后再次从本地存储中获取并将其传递给我们的订阅者。

storage
            .getFooFromLocal()
            .switchIfEmpty(network.getFooFromNetwork().map { it[0] }
                    .flatMapCompletable { storage.saveFoo(it) }
                    .andThen(storage.getFooFromLocal()))
                    .subscriber(/**/)

问题是 andThen 部分在 completable 传递到 flatMapCompletable 之前完成。我发现如果我包装到 Maybe.defer{} 中,我可以摆脱这个问题。但是根据 andThen 的文档 它

Returns a Maybe which will subscribe to this Completable.

也许已经是

Represents a deferred computation and emission of a maybe value or exception

所以问题是为什么我的 andThen 部分在 completable 完成之前运行。编写此类链条的最佳和优雅方式是什么。

通话记录:

06:05:58.803 getFooFromLocal
06:05:58.804 getFooFromLocal
06:05:58.804 getFooFromNetwork
06:05:59.963 saveFoo

最佳答案

这对我有用:

public class AndThenTest {

    Integer value;

    @Test
    public void test() {
        getFromLocal()
        .switchIfEmpty(getFromNetwork()
                .flatMapCompletable(v -> saveFoo(v))
                .andThen(getFromLocal()))
        .doOnSuccess(e -> System.out.println("Success: " + e))
        .test()
        .awaitDone(5, TimeUnit.SECONDS)
        .assertResult(10);
    }

    Maybe<Integer> getFromLocal() {
        return Maybe.fromCallable(() -> {
            System.out.println("FromLocal called");
            return value;
        });
    }

    Single<Integer> getFromNetwork() {
        return Single.fromCallable(() -> {
            System.out.println("FromNetwork called");
            return 10;
        }).delay(100, TimeUnit.MILLISECONDS)
                ;
    }

    Completable saveFoo(Integer v) {
        return Completable.fromRunnable(() -> {
            System.out.println("SaveFoo called");
            value = v;
        });
    }
}

并打印:

FromLocal called
FromNetwork called
SaveFoo called
FromLocal called
Success: 10

所以我的猜测是您没有展示的其中一种方法有误。

关于android - AndThen 在可完成完成之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45834989/

相关文章:

java - first() 和 take(1) 的区别

android - Rx 和 Kotlin 中的泛型函数引用——类型推断失败

java - 在 Android 上计算文件中的 XML 元素

java - 媒体播放器示例应用程序崩溃

reactive-programming - 使用 RxJava 编写具有依赖项的异步 Observable

java - 我的 rxjava 程序中的 Scheduler.Worker 线程引发致命异常

android - SwitchIfEmpty 没有在里面执行 maybesource

android - RX如何根据错误类型返回Throwable或Object

android - Firebase 动态链接不起作用

android - 方法被调用多次但只调用一次