【问题标题】:Async Observable inside Async ObservableAsync Observable 内部的 Async Observable
【发布时间】:2016-10-28 13:42:49
【问题描述】:

我遇到了一个小问题,我正在使用 RxJava 从服务器中检索数据,然后将这些数据与本地数据进行检查,问题是我开始在本地检查文件并存储数据,然后我启动我得到的 observable数据完全下载之前的SUCCESS,然后我在成功后收到“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)));

更新: initRemoteData 代码:

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();

【问题讨论】:

    标签: java android asynchronous observable rx-android


    【解决方案1】:

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

    更新: 好的,那么为什么不只是 return 这个“等待” 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
    });
    }
    

    【讨论】:

    • 在getCheckObservable中我已经在“initRemoteData”中调用了一个Observable.zip,这是一个单独的功能,但我需要一些数据,问题“initRemoteData”它可能会在getCheckObservable的整个执行后完成( ) 它不会对主要功能造成问题,但如果我做得正确可能会更好:p
    • 不确定我是否正确理解了您。可以分享initRemoteData()的代码吗?
    • 我放了一些简化的代码,但足以理解这个想法
    猜你喜欢
    • 2019-05-08
    • 2018-02-05
    • 2020-02-05
    • 2023-03-10
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多