加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用RxJava和Retrofit处理列表

发布时间:2020-12-14 17:47:27 所属栏目:Java 来源:网络整理
导读:我有几个api调用(顺序地,异步地),其中一些返回列表.我的api界面如下. @GET("/users/settings")ObservableUserWrapper getUserSettings();@GET("/{username}/collections")ObservableListItem getItems(@Path("username") String userName);@GET("/item/{id}"
我有几个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(朋友)来保存每个朋友

现在我是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))

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读