在Android中使用RxJava和Retrofit处理列表

12

我有几个API调用需要进行(按顺序,异步),其中一些返回列表。我的API接口如下。

@GET("/users/settings")
Observable<UserWrapper> getUserSettings();

@GET("/{username}/collections")
Observable<List<Item>> getItems(@Path("username") String userName);

@GET("/item/{id}")
Observable<ItemInfo> getItemInfo(@Path("id") int id);

@GET("/{username}/friends")
Observable<List<Friend>> getFriends(@Path("username") String userName);

以下是我想要按顺序完成的步骤:

  • 通过调用getUserSettings()获得UserWrapper
  • 通过调用saveUser(userWrapper)保存用户
  • 通过调用getItems(userWrapper.getUserName())获取用户的物品
  • 通过调用getItemInfo(item.getId())获取每个物品的信息
  • 通过调用saveItem(itemInfo)保存每个itemInfo
  • 通过调用getFriends(userWrapper.getUserName())获取用户的朋友
  • 通过调用saveFriend(friend)保存每个朋友

现在我刚开始接触RxJava,不知道如何处理列表。我看了Jake Wharton的幻灯片之一,发现他使用了一个函数flattenList(),但我不知道它的定义。如果你能帮忙组成这个链条就太好了。


更新1

目前为止我已经做到了这一步:

mApiService.getUserSettings()
            .map(this::saveUser)
            .flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName()));
            .flatMapIterable( ? "How to iterate for each item" ? );

更新2

我正在尝试写类似于这样的东西

mApiService.getUserSettings()
    .map(this::saveUser)
    .flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName()))
    .someMethodToIterateThroughEachItem(item -> mApiService.getItemInfo(item))
    .map(this::saveItem)
    .someMethodThatCanCallUserWrapperAgain(userWrapper -> mApiService.getFriends(userWrapper.getUserName()))
    .someMethodToIterateThoughEachFriend(friend -> saveFriend(friend))

1
someMethodToIterateThroughEachItem是什么?它是如何编译的? - IgorGanapolsky
请提供有关 someMethodToIterateThroughEachItemsomeMethodThatCanCallUserWrapperAgainsomeMethodToIterateThoughEachFriend 的更多详细信息。 - Nguyen Minh Binh
1个回答

20

RxJava已经添加了flatMapIterable。所以现在不需要使用flattenList了,例如:

  Observable<UserWrapper> o =
       getUserSettings()
       .doOnNext(this::saveUser)
       .flatMap(user -> getItems(user.getUserName())
                        .flatMapIterable(items -> items)
                        .flatMap(item -> getItemInfo(item.getId()))
                        .doOnNext(this::saveItem)
                        .toList()
                        .map(ignored -> user))
        .flatMap(user -> getFriends(user.getUserName())
                         .flatMapIterable(friends -> friends)
                         .doOnNext(this::saveFriend)
                         .toList()
                         .map(ignored -> user)
        );
    o.subscribe(...);

谢谢@zsxwing,我已经到了这个地步。请查看我的更新问题:如何迭代此调用中的每个项?RxJava 中没有任何内置函数吗? - Raquib-ul Alam
你能详细说明一下你想做什么吗? - zsxwing
我已经更新了问题,以便您更好地理解。请也阅读项目符号。希望这回答了您的问题。 - Raquib-ul Alam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接