我需要通过链接多个retrofit API调用来创建一个可观察对象。
我有两个服务:ItemService仅包含项目名称和ID,而ItemDetailsService包含关于项目的许多其他详细信息,例如描述图像等。 我正在使用Retrofit 2 + RxJava + Dagger 2。
ItemService:
@GET("apione/items")
Observable<List<Items>> getItems();
ItemDetailsService:
@GET("apitwo/item/{id}")
Observable<ItemDetail> getItemDetails(@Path("id") int id);
项目的JSON:
[
{
"id": 1,
"name": "one"
},
{
"id": 2,
"name": "two"
},
{
"id": 3,
"name": "three"
}
]
一个具体物品的ItemDetails json:
{
"id": 1,
"image_url": "http://.../1.png",
"description": "description of item one",
"category": "cat_1",
"quantity" 10
}
这两个API有不同的基础URL,那么如何创建一个Observable,返回包含图片、数量和类别的项目列表?
更新:
我卡在这里了。这是我的ItemPresenter:
public class ItemPresenter extends BasePresenter<ItemView> implements Observer<List<Item>> {
@Inject protected ItemService mItemService;
@Inject protected ItemDetailsService mItemDetailsService;
@Inject
public ItemPresenter() {
}
public void getItems() {
getView().onShowDialog("Loading");
Observable<List<Item>> itemObservables= mItemService.getItems()
.flatMap(new Func1<List<Item>, Observable<ItemDetail>>() {
@Override
public Observable<ItemDetail> call(List<Item> items) {
List<Observable<ItemDetail>> detailObservables = new ArrayList<>();
for (Item item : items) {
detailObservables.add(mItemDetailsService.getItemDetail(item.getId());
}
return Observable.zip(
detailObservables,
args -> {
List<Item> itemDetails = new ArrayList<>();
for (Object arg : args) {
itemDetails.add((Item) arg);
}
return itemDetails;
}
);
}
});
subscribe(detailObservables, this);
}
@Override
public void onCompleted() {
getView().onHideDialog();
getView().onShowToast("Complete");
}
@Override
public void onError(Throwable e) {
getView().onHideDialog();
getView().onShowToast("Error loading " + e.getMessage());
}
@Override
public void onNext(List<Item> items) {
getView().onItems(items);
}
}
我不太明白如何正确地制作。如果我只需要列表中某些项目的少量详细信息而不是从ItemDetail获得全部内容,那么我该怎么办?
我只需要将ItemDetail中的一些详细信息添加到Items列表中。
flatMap
? - EpicPandaForce