繁体   English   中英

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

[英]Handling lists with RxJava and Retrofit in android

我有几个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的新手,不知道如何处理列表。 我看了杰克沃顿的一张幻灯片 ,发现他使用的函数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))

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(...);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM