使用参数中第一个的结果将两个 Observable 与第二个结合
Combine two Observables with the second using results from the first one in parameters
我有两个方法 return Observable< Response< ResponseBody > >
firstAPI.getFirstInfo("1", "2");
secondApi.getSecondInfo(resultFirstObservable, "3");
我正在尝试从第一个中获取信息并将其用作第二个中的参数。
我开始尝试使用平面地图:
Observable<Integer> mergedObservers = firstAPI.getFirstInfo("1","2")
.flatMap((Response<ResponseBody> resultFirstObservable) -> {
try {
return secondApi.getSecondInfo(transformToTheFormatNeeded(resultFirstObservable.body().string()), "3");
} catch (IOException e) {
e.printStackTrace();
return secondApi.getSecondInfo("defaultValue", "3");
}
}, ((Response<ResponseBody> resultFirstObservable), (Response<ResponseBody> resultSecondObservable)) -> {
try {
return transformToWhatINeed(resultSecondObservable.body().string());
} catch (IOException e) {
e.printStackTrace();
}
});
然后我会尝试订阅这个新的 Observable 和 onNext 我会发送 returned 值到我的 Activity.
Subscription sub = mergedObservers.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.repeatWhen(completed -> completed.delay(30, TimeUnit.SECONDS))
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
view.updateInfo(integer);
}
});
我的问题是 flatMap 在编译时抛出 2 个错误:
错误:lambda 主体既不兼容值也不兼容 void
错误:找不到合适的方法
flatMap((__)->{ tr[...]; } },(.. ,..)->{ [...]; } })
我做错了什么?
我不认为 API 调用实际上抛出一个 IOException
同时 return 一个 Observable。此外,您必须 return 来自第二个 lambda 的东西,但是那里的 try-catch 没有这样做,从而导致错误。试试这个:
Observable<Integer> mergedObservers = firstAPI.getFirstInfo("1","2")
.flatMap(resultFirstObservable -> {
return secondApi.getSecondInfo(resultFirstObservable, "3")
.onErrorResumeNext(e -> {
e.printStackTrace();
return secondApi.getSecondInfo("defaultValue", "3");
});
}, (resultFirstObservable, resultSecondObservable) -> {
try {
return transformToWhatINeed(resultSecondObservable.body().string());
} catch (IOException ex) {
ex.printStackTrace();
return "";
}
});
我有两个方法 return Observable< Response< ResponseBody > >
firstAPI.getFirstInfo("1", "2");
secondApi.getSecondInfo(resultFirstObservable, "3");
我正在尝试从第一个中获取信息并将其用作第二个中的参数。
我开始尝试使用平面地图:
Observable<Integer> mergedObservers = firstAPI.getFirstInfo("1","2")
.flatMap((Response<ResponseBody> resultFirstObservable) -> {
try {
return secondApi.getSecondInfo(transformToTheFormatNeeded(resultFirstObservable.body().string()), "3");
} catch (IOException e) {
e.printStackTrace();
return secondApi.getSecondInfo("defaultValue", "3");
}
}, ((Response<ResponseBody> resultFirstObservable), (Response<ResponseBody> resultSecondObservable)) -> {
try {
return transformToWhatINeed(resultSecondObservable.body().string());
} catch (IOException e) {
e.printStackTrace();
}
});
然后我会尝试订阅这个新的 Observable 和 onNext 我会发送 returned 值到我的 Activity.
Subscription sub = mergedObservers.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.repeatWhen(completed -> completed.delay(30, TimeUnit.SECONDS))
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
view.updateInfo(integer);
}
});
我的问题是 flatMap 在编译时抛出 2 个错误:
错误:lambda 主体既不兼容值也不兼容 void
错误:找不到合适的方法 flatMap((__)->{ tr[...]; } },(.. ,..)->{ [...]; } })
我做错了什么?
我不认为 API 调用实际上抛出一个 IOException
同时 return 一个 Observable。此外,您必须 return 来自第二个 lambda 的东西,但是那里的 try-catch 没有这样做,从而导致错误。试试这个:
Observable<Integer> mergedObservers = firstAPI.getFirstInfo("1","2")
.flatMap(resultFirstObservable -> {
return secondApi.getSecondInfo(resultFirstObservable, "3")
.onErrorResumeNext(e -> {
e.printStackTrace();
return secondApi.getSecondInfo("defaultValue", "3");
});
}, (resultFirstObservable, resultSecondObservable) -> {
try {
return transformToWhatINeed(resultSecondObservable.body().string());
} catch (IOException ex) {
ex.printStackTrace();
return "";
}
});