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