处理列表和RxJava和改造的机器人 [英] Handling lists with RxJava and Retrofit in android

查看:262
本文介绍了处理列表和RxJava和改造的机器人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个API调用来使(连续,异步),其中一些将返回列表。我的API接口下面给出。

  @GET(/用户/设置)
可观察< UserWrapper> getUserSettings();

@GET(/ {用户名} /集合)
可观察<列表<项目>> getItems(@Path(用户名)字符串用户名);

@GET(/项目/ {ID})
可观察< ItemInfo> getItemInfo(@Path(ID)INT ID);

@GET(/ {用户名} /朋友)
可观察<列表<朋友>> getFriends(@Path(用户名)字符串用户名);
 

这就是我想要做的顺序:

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

现在我是新来RxJava,不知道如何处理名单。我看到的杰克沃顿商学院的幻灯片的一个,发现他使用的函数 flattenList (),但我不知道它的定义。这将是巨大的,如果你能帮助撰写这条产业链。


更新1

这是据我现在已经得到了:

  mApiService.getUserSettings()
            .MAP(这:: saveUser)
            .flatMap(userWrapper  - > mApiService.getItems(userWrapper.getUserName()));
            .flatMapIterable(?如何循环的每个项目?);
 


更新2

我想写这样的事情

  mApiService.getUserSettings()
    .MAP(这:: saveUser)
    .flatMap(userWrapper  - > mApiService.getItems(userWrapper.getUserName()))
    .someMethodToIterateThroughEachItem(项目 - > mApiService.getItemInfo(项目))
    .MAP(这:: saveItem)
    .someMethodThatCanCallUserWrapperAgain(userWrapper  - > mApiService.getFriends(userWrapper.getUserName()))
    .someMethodToIterateThoughEachFriend(朋友 - > saveFriend(朋友))
 

解决方案

RxJava增加 flatMapIterable 。所以,你不需要 flattenList 现在。例如,

 观测< UserWrapper> O =
       getUserSettings()
       .doOnNext(这:: saveUser)
       .flatMap(用户 - > getItems(user.getUserName())
                        .flatMapIterable(项目 - >项目)
                        .flatMap(项目 - > getItemInfo(item.getId()))
                        .doOnNext(这:: saveItem)
                        .toList()
                        .MAP(忽略 - >用户))
        .flatMap(用户 - > getFriends(user.getUserName())
                         .flatMapIterable(朋友 - >朋友)
                         .doOnNext(这:: saveFriend)
                         .toList()
                         .MAP(忽略 - >用户)
        );
    o.subscribe(...);
 

I have couple of api calls to make (sequentially, asynchronously) and some of them returns lists. My api interface is given below.

@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);

Here's what I want to do sequentially:

  • Get UserWrapper by calling getUserSettings()
  • Save the user by calling saveUser(userWrapper)
  • Get user's items by calling getItems(userWrapper.getUserName())
  • Get each item's information by calling getItemInfo(item.getId())
  • Save each itemInfo by calling saveItem(itemInfo)
  • Get user's friends by calling getFriends(userWrapper.getUserName())
  • Save each friend by calling saveFriend(friend)

Now I am new to RxJava and do not know how to handle lists. I watched one of Jake Wharton's slides and found that he uses a function flattenList() but I don't know its definition. It would be great if you can help composing this chain.


Update 1

This is as far I've gotten now:

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


Update 2

I am trying to write something like this

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 has added flatMapIterable. So you don't need flattenList now. E.g.,

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

这篇关于处理列表和RxJava和改造的机器人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆