首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用RxJava和Retrofit迭代列表,并根据子查询增加结果

使用RxJava和Retrofit迭代列表,并根据子查询增加结果
EN

Stack Overflow用户
提问于 2015-05-14 10:50:10
回答 3查看 7K关注 0票数 11

我使用的是retrofit,我觉得rxjava (使用retrolambda)很适合下面的流程:

  1. 获取小部件列表(http)
  2. 对于每个小部件 ( a)获取给定小部件类型的文章列表(http) b)将所有这些都保存到db ( c)以列表中的第一篇(最新)文章为例,使用本文中的适当值更新widget.articleName和widget.articleUrl
  3. 转换回列表并完成

然而,我不知道在步骤2a之后该做什么。到目前为止这是我的代码

代码语言:javascript
运行
复制
apiService.getWidgets(token)
  .flatMapIterable(widgets -> widgets)
  .flatMap(widget -> apiService.getArticles(token, widget.type))
  ...
  .toList()
  .subscribe(
     modifiedWidgets -> saveWidgets(modifiedWidgets),
     throwable -> processWidgetError(throwable)
  );

我曾与一些操作符玩过,但是当链接时,我似乎总是缩小得太窄(例如,获得一篇文章的句柄),然后就不能再访问原始小部件来进行修改了。

代码语言:javascript
运行
复制
@GET("/widgets")
Observable<List<Widget>> getWidgets(@Header("Authorization") String token);

@GET("/articles")
Observable<List<Article>> getArticles(@Header("Authorization") String token, @Query("type") String type);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-14 11:53:12

您可以在流的某些点插入doOnNext以添加副作用:

代码语言:javascript
运行
复制
apiService.getWidgets(token)
.flatMapIterable(v -> v)
.flatMap(w -> 
    apiService.getArticles(token, w.type)
    .flatMapIterable(a -> a)
    .doOnNext(a -> db.insert(a))
    .doOnNext(a -> {
         w.articleName = a.name;
         w.articleUrl = a.url;
    })
    .takeLast(1)
    .map(a -> w)
)
.toList()
.subscribe(
    modifiedWidgets -> saveWidgets(modifiedWidgets),
    throwable -> processWidgetError(throwable)
);

这方面的Here is运行示例。

票数 23
EN

Stack Overflow用户

发布于 2016-05-04 20:29:34

在这里添加这一点,因为我找不到迭代对象中作为变量返回的列表的示例。

代码语言:javascript
运行
复制
getUserAccount(token)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .flatMap(userResponse -> Observable.just(userResponse.list))      //get list from response
    .flatMapIterable(baseDatas -> baseDatas)                          //make the list iterable
    .flatMap(baseData ->                                              //on each project, get the details
            getProjectDetails(baseData.name,token)
                    .subscribeOn(Schedulers.io())                     //get network call off the main thread
                    .observeOn(AndroidSchedulers.mainThread()))
    .subscribe(
            (dataResponse) -> {
                Timber.d( "Got Data Details:" + dataResponse);
            },
            (error) -> {
                Timber.e( "Got Error:" + error.getMessage());
            },
            () -> {
                Timber.d("Completed Data Details");
            }
    );
票数 1
EN

Stack Overflow用户

发布于 2017-03-18 04:33:16

akarnokd的回答很有帮助,但这可能会导致NetworkOnMainThreadException。为了解决这个问题,我增加了

代码语言:javascript
运行
复制
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())

每次请求

代码语言:javascript
运行
复制
apiService.getWidgets(token)
.observeOn(AndroidSchedulers.mainThread())      //added this
.subscribeOn(Schedulers.io())                   //added this
.flatMapIterable(v -> v)
.flatMap(w -> 
    apiService.getArticles(token, w.type)
    .observeOn(AndroidSchedulers.mainThread())  //added this
    .subscribeOn(Schedulers.io())               //added this
    .flatMapIterable(a -> a)
    .doOnNext(a -> db.insert(a))
    .doOnNext(a -> {
         w.articleName = a.name;
         w.articleUrl = a.url;
    })
    .takeLast(1)
    .map(a -> w)
)
.toList()
.subscribe(
    modifiedWidgets -> saveWidgets(modifiedWidgets),
    throwable -> processWidgetError(throwable)
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30235441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档