RxJava - 如何从嵌套方法

时间:2017-10-24 06:47:46

标签: java android retrofit rx-java rx-java2

在我的Presenter中,我有一个从DataHolder获取一些列表的方法:

disposable.add(dataHolder.getMonthOfAttractions(monthInAdvance)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableSingleObserver<Map<String, List<Attraction>>>() {
                @Override
                public void onSuccess(Map<String, List<Attraction>> stringListMap) {

                }

                @Override
                public void onError(Throwable e) {

                }
            }));

然后,在我的DataHolder中,我检查我的列表是否为空。如果为true,则返回我的列表,如果为false,则从服务器下载此列表:

public Single<Map<String, List<Attraction>>> getMonthOfAttractions(int monthInAdvance) {
    Map<String, List<Attraction>> monthOfAttractions = monthlyAttractionsMap.get(monthInAdvance);
    if (monthOfAttractions != null)
        return Single.fromCallable(() -> monthOfAttractions);
    else
        return apiGetMonthOfAttractions(monthInAdvance);

问题在于apiGetMonthOfAttractions方法。我不知道如何正确实现此方法以将值返回给我的Presenter。

我尝试过类似的事情:

private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
    cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance)
            .subscribeWith(new CnkApiObserver<AttractionListResponse>() {
                @Override
                public void onSucceeded(AttractionListResponse result) {
                    result.getMonthOfAttractions();
                }

                @Override
                public void onFailed(Error error) {
                }
            });
}

但在这种情况下,我有&#34;缺少退货声明&#34;而且我没有想法如何实现它。我乞求学习RxJava,所以要理解。

请帮忙:)

编辑: 这就是我的Retrofit getAttractions()方法的样子:

public interface CnkApiInterface {

@GET("pl/front-api/{dateFrom}/{dateTo}")
Single<AttractionListResponse> getAttractions(@Path("dateFrom") String dateFrom, @Path("dateTo") String dateTo);}

3 个答案:

答案 0 :(得分:1)

这就是你所追求的:

private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
    return cnkRetrofitProvider.getApiInterface()
            .getAttractions(monthInAdvance)
            .flatMap(attractionListResponse -> Single.just(attractionListResponse.getMonthOfAttractions()));
}

答案 1 :(得分:0)

我只是尝试做类似的事情(它只取决于你的cnkRetrofitProvider.getApiInterface()。getAttractions(monthInAdvance)返回)

private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
  return cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance)

}

应该做的伎俩

答案 2 :(得分:0)

你总是可以将结果映射到List<Attraction>所以@wojech_maciejewski的答案仍然存在,你需要添加一个映射函数。

private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
  return cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance)
                            .map(atractions -> /* convert to List<Attraction> here */) 

}