在我的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);}
答案 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 */)
}