使用android中的RxJava和Retrofit处理列表

时间:2014-12-29 17:35:26

标签: android android-asynctask retrofit rx-java

我有几个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);

这是我想要按顺序执行的操作:

  • 致电UserWrapper
  • 获取getUserSettings()
  • 通过致电saveUser(userWrapper)
  • 保存用户
  • 致电getItems(userWrapper.getUserName())
  • 获取用户的项目
  • 致电getItemInfo(item.getId())
  • 获取每件商品的信息
  • 通过致电itemInfo
  • 保存每个saveItem(itemInfo)
  • 致电getFriends(userWrapper.getUserName())
  • 获取用户的朋友
  • 致电saveFriend(friend)
  • 保存每位朋友

现在我是RxJava的新手,不知道如何处理列表。我看了一个Jake Wharton's slides,发现他使用了一个函数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 个答案:

答案 0 :(得分: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(...);