RxJava - 如何从嵌套方法中获取 Single
RxJava - How to get Single from nested method
在我的 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 中检查我的列表是否不为空。如果为真,return 是我的列表,如果为假,它会从服务器下载此列表:
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 方法上。我不知道如何正确实施此方法以 return 我的演示者的价值。
我试过类似的方法:
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) {
}
});
}
但在这种情况下,我有 "missing return statement" 但我不知道如何实施它。我乞求学习 RxJava,所以要理解。
请帮忙:)
编辑:
这就是我的 Retrofit getAttractions() 方法的样子:
public interface CnkApiInterface {
@GET("pl/front-api/{dateFrom}/{dateTo}")
Single<AttractionListResponse> getAttractions(@Path("dateFrom") String dateFrom, @Path("dateTo") String dateTo);}
我只是尝试做类似的事情(这只取决于你的 cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance) returns)
private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
return cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance)
}
应该可以解决问题
这就是你想要的:
private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
return cnkRetrofitProvider.getApiInterface()
.getAttractions(monthInAdvance)
.flatMap(attractionListResponse -> Single.just(attractionListResponse.getMonthOfAttractions()));
}
你总是可以将结果映射到 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 */)
}
在我的 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 中检查我的列表是否不为空。如果为真,return 是我的列表,如果为假,它会从服务器下载此列表:
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 方法上。我不知道如何正确实施此方法以 return 我的演示者的价值。
我试过类似的方法:
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) {
}
});
}
但在这种情况下,我有 "missing return statement" 但我不知道如何实施它。我乞求学习 RxJava,所以要理解。
请帮忙:)
编辑: 这就是我的 Retrofit getAttractions() 方法的样子:
public interface CnkApiInterface {
@GET("pl/front-api/{dateFrom}/{dateTo}")
Single<AttractionListResponse> getAttractions(@Path("dateFrom") String dateFrom, @Path("dateTo") String dateTo);}
我只是尝试做类似的事情(这只取决于你的 cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance) returns)
private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
return cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance)
}
应该可以解决问题
这就是你想要的:
private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
return cnkRetrofitProvider.getApiInterface()
.getAttractions(monthInAdvance)
.flatMap(attractionListResponse -> Single.just(attractionListResponse.getMonthOfAttractions()));
}
你总是可以将结果映射到 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 */)
}