java - 异步 Observable 内部的异步 Observable

标签 java android asynchronous observable rx-android

我遇到了一个小问题,我使用 RxJava 从服务器检索数据,然后将这些数据与本地的数据进行检查,问题是我开始检查本地文件并存储数据,然后启动我得到的可观察数据在数据完全下载之前成功,然后我在成功后收到“initRemoteData”结果。

所以我需要做的是,当我调用“InitRemoteData”时,当可观察给出结果时,我继续阻止可观察。

private Observable<CheckStatus> getCheckObservable() {
    return Observable.defer(() -> {
        DataDTO dto;
        try {
            dto = Utils.decryptData(
                localfile.getNonce(),
                localfile.getEncryptedData(),
                password);
        } catch (WrongPasswordException e) {
            return Observable.just(CheckStatus.WRONG_PASSWORD);
        }
        try {
            storeDataPrefs(dto);
        } catch (RuntimeException e) {
            return Observable.just(CheckStatus.OTHER_ERROR);
        }
        storeDatabase(dto);

        initRemoteData();//<-Here i did call for another observable but the observable keep going without waiting it to finish.



        return Observable.just(CheckStatus.SUCCESS);
    });
}

可观察的调用:

getCheckObservable()
        .subscribeOn(BackgroundSchedulers.getMultiThreadInstance())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(Subscribers.create(checkResult -> replaceFragment(
            CheckAccountCompleteFragment
                .newInstance(checkResult),
            AddToBackStack.FALSE)));

更新: 初始化远程数据代码:

Observable.zip(getObservable1()),//remote Data
            getObservable2(), // local Data
            (observableResult1,observableResult2)->{
                doSomethingWith(observableResult1,observableResult2); // compare between data
                return null;
            }).subscribeOn(BackgroundSchedulers.getMultiThreadInstance())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnCompleted(() -> {
                    doSomething2(); // update fields
                }
            })
            .subscribe();

最佳答案

如果我猜对了,您需要让 getCheckObservable() 来等待这两个结果吗?如果是:Observable.combineLatest() 可以帮助您。

更新: 好吧,那么为什么不直接返回这个“大”Observable 中的“等待”Observable 像这样:

Observable.zip(getObservable1()),//remote Data
        getObservable2(), // local Data
        (observableResult1,observableResult2)->{
            doSomethingWith(observableResult1,observableResult2); // compare between data

            return CheckStatus.SUCCESS;   // <-- CHANGES

        }).subscribeOn(BackgroundSchedulers.getMultiThreadInstance())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnCompleted(() -> {
                doSomething2(); // update fields
            }
        });

private Observable<CheckStatus> getCheckObservable() {
return Observable.defer(() -> {
    DataDTO dto;
    try {
        dto = Utils.decryptData(
            localfile.getNonce(),
            localfile.getEncryptedData(),
            password);
    } catch (WrongPasswordException e) {
        return Observable.just(CheckStatus.WRONG_PASSWORD);
    }
    try {
        storeDataPrefs(dto);
    } catch (RuntimeException e) {
        return Observable.just(CheckStatus.OTHER_ERROR);
    }
    storeDatabase(dto);

    return initRemoteData();       // <-- CHANGES
});
}

关于java - 异步 Observable 内部的异步 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40306396/

相关文章:

android - Espresso 测试被后台线程阻塞。应用程序未空闲异常 : "AppNotIdleException."

javascript - 使用jquery异步上传文件的操作

javascript - 如何从异步调用返回响应?

java - 如何迭代 List<List<T>> 的所有组合

java - 从命令提示符运行 jar 文件时如何在 log4j.properties 文件中指定日志文件位置

android - 过渡 android fragment 向上滑动

c# - 如果使用 Task.Delay,Task.WhenAll 的行为会有所不同

java - (J2ME) 如何在 midlet 中检索设备颜色深度?

java - 强制 stringBuilder 为大写

java - 从服务器中的文本文件中获取数据到 Android 应用程序