RxJava 合并请求序列
问题
我有两个 Api。Api 1 为我提供了一个项目列表,Api 2 为我提供了从 Api 1 获得的每个项目的更详细信息。到目前为止,我解决它的方式导致性能不佳。
问题
在Retrofit和RxJava的帮助下,有效地快速解决了这个问题。
我的方法
目前,我的解决方案如下所示:
步骤 1:从 Api 1 执行改造。Single<ArrayList<Information>>
步骤 2:我循环访问此项,并向 Api 2 发出每个项的请求。
步骤 3:改造返回 按顺序执行每个项目Single<ExtendedInformation>
步骤 4:在 API 2 的所有调用完全执行后,我为所有项目创建一个新对象,其中包含信息和扩展信息。
我的代码
public void addExtendedInformations(final Information[] informations) {
final ArrayList<InformationDetail> informationDetailArrayList = new ArrayList<>();
final JSONRequestRatingHelper.RatingRequestListener ratingRequestListener = new JSONRequestRatingHelper.RatingRequestListener() {
@Override
public void onDownloadFinished(Information baseInformation, ExtendedInformation extendedInformation) {
informationDetailArrayList.add(new InformationDetail(baseInformation, extendedInformation));
if (informationDetailArrayList.size() >= informations.length){
listener.onAllExtendedInformationLoadedAndCombined(informationDetailArrayList);
}
}
};
for (Information information : informations) {
getExtendedInformation(ratingRequestListener, information);
}
}
public void getRatingsByTitle(final JSONRequestRatingHelper.RatingRequestListener ratingRequestListener, final Information information) {
Single<ExtendedInformation> repos = service.findForTitle(information.title);
disposable.add(repos.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribeWith(new DisposableSingleObserver<ExtendedInformation>() {
@Override
public void onSuccess(ExtendedInformation extendedInformation) {
ratingRequestListener.onDownloadFinished(information, extendedInformation);
}
@Override
public void onError(Throwable e) {
ExtendedInformation extendedInformation = new ExtendedInformation();
ratingRequestListener.onDownloadFinished(extendedInformation, information);
}
}));
}
public interface RatingRequestListener {
void onDownloadFinished(Information information, ExtendedInformation extendedInformation);
}