代码之家  ›  专栏  ›  技术社区  ›  Katy Colins

RXJava,每个循环都有

  •  1
  • Katy Colins  · 技术社区  · 8 年前

    我试图通过每个内容异步地从本地数据库中获取数据,但问题是我希望按照我检索的顺序获取数据,首先是第一个内容的数据,而不是第二个内容的数据等,目前我每次运行代码时都是以错误的顺序获取数据,我如何才能实现是?

     for (Content content : contents) {
                    scoreCardDisposable = AppManagers.getContentManager()
                            .getScoreCardsAndUpdate(content.getId())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(scoreCards -> {
                               ...
                            });
                    compositeDisposable.add(scoreCardDisposable);
    
               }
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   Dmitry    8 年前

    从一个 List<> 你可以用 Observable.fromIterable 操作员:

    compositeDisposable.add(Observable.fromIterable(contents)
                .flatMap(content -> {
                    return AppManagers.getContentManager()
                            .getScoreCardsAndUpdate(content.getId());
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(scoreCards -> {
                    ...
                }));
    

    小精灵 :

    您可以使用 zip 运算符将内容与GetScorecards合并,并在自定义对象中更新结果:

    class Result {
        private String content;
        private String result;
    
        public Result(String content, String result) {
            this.content = content;
            this.result = result;
        }
    
        public String getContent() {
            return content;
        }
    
        public String getResult() {
            return result;
        }
    }
    
    public Observable<String> getScoreCardsAndUpdate(String content) {
        return Observable.just("result = " + content);
    }
    
    @Test
    public void test() {
        List<String> contents = Arrays.asList("1", "2", "3", "4");
    
        Observable.fromIterable(contents)
                .flatMap(content -> {
                    return Observable.zip(Observable.just(content), 
                            getScoreCardsAndUpdate(content), Result::new);
                })
                .subscribe(scoreCards -> {
                    System.out.println("content = " + scoreCards.getContent() + 
                            ", " + scoreCards.getResult());
                });
    }
    
        2
  •  1
  •   Suhaib Roomy    8 年前

    您必须在一个线程中处理所有项目。您可以通过在rxjava2中添加一个调度程序来实现这一点。

    .subscribeOn(Schedulers.single())
    

    你的代码应该是

    for (Content content : contents) {
                scoreCardDisposable = AppManagers.getContentManager()
                        .getScoreCardsAndUpdate(content.getId())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribeOn(Schedulers.single())
                        .subscribe(scoreCards -> {
                           ...
                        });
                compositeDisposable.add(scoreCardDisposable);
    
           }