RxJava + Retrofit 2 связывает запросы APIAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 RxJava + Retrofit 2 связывает запросы API

Сообщение Anonymous »

Мне нужно создать наблюдаемый объект, объединив несколько вызовов модифицированного API.
У меня есть 2 сервиса: ItemService, который содержит только имя и идентификатор элемента, и ItemDetailsService, который содержит множество других сведений о элемент, например изображение описания и т. д. Я использую Retrofit 2 + RxJava + Dagger 2.
ItemService:

Код: Выделить всё

@GET("apione/items")
Observable getItems();
ItemDetailsService:

Код: Выделить всё

@GET("apitwo/item/{id}")
Observable getItemDetails(@Path("id") int id);
Элементы JSON:

Код: Выделить всё

[
{
"id": 1,
"name": "one"
},
{
"id": 2,
"name": "two"
},
{
"id": 3,
"name": "three"
}
]
Сведения об элементе 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 implements Observer {

@Inject protected ItemService mItemService;

@Inject protected ItemDetailsService mItemDetailsService;

@Inject
public ItemPresenter() {

}

public void getItems() {
getView().onShowDialog("Loading");
Observable itemObservables= mItemService.getItems()
.flatMap(new Func1() {
@Override
public Observable call(List items) {
List detailObservables = new ArrayList();
for (Item item : items) {
detailObservables.add(mItemDetailsService.getItemDetail(item.getId());
}
return Observable.zip(
detailObservables,
args -> {
List 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 items) {
getView().onItems(items);
}

}
Не понимаю, как это сделать правильно. А что мне делать, если мне нужно лишь несколько сведений об элементах в списке, а не все из ItemDetail?
Мне нужно только добавить некоторые сведения из ItemDetail в список элементов.

Подробнее здесь: https://stackoverflow.com/questions/401 ... i-requests
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»