Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异步可观察内部异步可观察_Java_Android_Asynchronous_Observable_Rx Android - Fatal编程技术网

Java 异步可观察内部异步可观察

Java 异步可观察内部异步可观察,java,android,asynchronous,observable,rx-android,Java,Android,Asynchronous,Observable,Rx Android,我遇到了一个小问题,我正在使用RxJava从服务器检索数据,然后用本地的数据检查这些数据,问题是我开始检查本地的文件并存储数据,然后我开始观察我在数据完全下载之前获得成功,成功后我收到“initRemoteData”结果 因此,我需要做的是在调用“InitRemoteData”时阻止可观察对象,当可观察对象给出我继续的结果时 private Observable<CheckStatus> getCheckObservable() { return Observable.def

我遇到了一个小问题,我正在使用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);
    });
}
更新: 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();

如果我得到正确答案,您需要使
getCheckObservable()
等待这两个结果?如果是:
可观察。CombineTest()
可以帮助您

更新: 好的,那么为什么不在“大”一中观察到这个“等待”呢 像这样:

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
            }
        });
Observable.zip(getObservable1()),//远程数据
getobserve2(),//本地数据
(observableResult1,observableResult2)->{
doSomethingWith(observableResult1,observableResult2);//比较数据
返回CheckStatus.SUCCESS;//{
doSomething2();//更新字段
}
});

private Observable getCheckObservable(){
返回可观察。延迟(()->{
数据传输到数据传输;
试一试{
dto=Utils.decrypteddata(
localfile.getNonce(),
localfile.getEncryptedData(),
密码);
}捕获(错误密码异常e){
返回Observable.just(CheckStatus.error_PASSWORD);
}
试一试{
storeDataPrefs(dto);
}捕获(运行时异常e){
返回Observable.just(CheckStatus.OTHER_ERROR);
}
存储数据库(dto);

返回initRemoteData();//如果我得到正确的结果,您需要使
getCheckObservable()
等待这两个结果?如果是:
Observable.CombineTest()
可以帮助您

更新: 好的,那么为什么不在“大”一中观察到这个“等待”呢 像这样:

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
            }
        });
Observable.zip(getObservable1()),//远程数据
getobserve2(),//本地数据
(observableResult1,observableResult2)->{
doSomethingWith(observableResult1,observableResult2);//比较数据
返回CheckStatus.SUCCESS;//{
doSomething2();//更新字段
}
});

private Observable getCheckObservable(){
返回可观察。延迟(()->{
数据传输到数据传输;
试一试{
dto=Utils.decrypteddata(
localfile.getNonce(),
localfile.getEncryptedData(),
密码);
}捕获(错误密码异常e){
返回Observable.just(CheckStatus.error_PASSWORD);
}
试一试{
storeDataPrefs(dto);
}捕获(运行时异常e){
返回Observable.just(CheckStatus.OTHER_ERROR);
}
存储数据库(dto);

return initRemoteData();//在getCheckObservable中,我已经在“initRemoteData”中调用了一个Observable.zip,这是一个单独的功能,但是我需要一些数据,问题“initRemoteData”可能会在整个getCheckObservable()执行后结束它不会对主要功能造成问题,但如果我做得正确,它可能会更好:p我不确定我是否正确理解了您。您可以共享
initRemoteData()
code吗?我输入了一些简化的代码,但足以理解getCheckObservable已经在“initRemoteData”中调用了obbservable.zip的想法这是一个单独的功能,但我需要一些数据,问题“initRemoteData”可能会在整个getCheckObservable()执行后完成。它不会对主要功能造成问题,但如果我做得正确可能会更好:p不确定我做得是否正确。您可以共享
initRemoteData()吗
code?我写了一些简化的代码,但足以理解这个想法
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
});
}