使用参数中第一个的结果将两个Observable与第二个

时间:2018-08-16 16:39:47

标签: java android rx-java observable rx-android

我有两种返回Observable >

的方法
firstAPI.getFirstInfo("1", "2");

secondApi.getSecondInfo(resultFirstObservable, "3");

我正试图从第一个信息中获取信息,并将其用作第二个信息中的参数。

我首先尝试使用flatMap:

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上将返回的值发送到我的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个错误:

  1. 错误:lambda主体既不兼容值也不兼容void

  2. 错误:找不到适合的方法 flatMap((__)-> {tr [...];}},(..,..)-> {[...];}})

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

我不认为API调用实际上会抛出IOException并返回Observable。另外,您必须从第二个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 "";
    }
});