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

Raq*_*nak 12 android android-asynctask rx-java retrofit

我有几个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);
Run Code Online (Sandbox Code Playgroud)

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

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

现在我是RxJava的新手,不知道如何处理列表.我看了杰克沃顿的一张幻灯片,发现他使用了一个功能,flattenList()但我不知道它的定义.如果你能帮助创作这个链条,那将是很棒的.


更新1

这是我现在得到的:

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

更新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))
Run Code Online (Sandbox Code Playgroud)

zsx*_*ing 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(...);
Run Code Online (Sandbox Code Playgroud)