【问题标题】:Combine two Observables with the second using results from the first one in parameters使用参数中第一个的结果将两个 Observable 与第二个结合起来
【发布时间】:2019-01-23 16:36:44
【问题描述】:

我有两个方法可以返回 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();
        }
    });

然后我会尝试 subscribeOn 这个新的 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[...]; } },(.. ,..)->{ [...]; } })

我做错了什么?

【问题讨论】:

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


【解决方案1】:

我认为 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 "";
    }
});

【讨论】:

  • 2 个 IOExceptions 是由于 .body().string() 引起的,并且 lambda 需要返回,但返回类型不被接受。因此,对于第一个 lambda,我使用默认值进行了另一个调用,而对于第二个,我返回了一个 transformToWhatINeed([])。它似乎工作。谢谢。
  • 如果“1”和“2”是变量,你认为如果我将它们替换为有时在其他方法中更改的“variable1”和“variable2”,每次订阅完成时,下次会更新吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2019-09-06
相关资源
最近更新 更多