rxjava用于每个循环

时间:2018-05-23 12:53:51

标签: android rx-java2

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

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

           }

2 个答案:

答案 0 :(得分:3)

要从Observable.fromIterable制作可观察的流,您可以使用compositeDisposable.add(Observable.fromIterable(contents) .flatMap(content -> { return AppManagers.getContentManager() .getScoreCardsAndUpdate(content.getId()); }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(scoreCards -> { ... })); 运算符:

zip

<强> UPD

您可以使用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()); }); } 运算符将内容与getScoreCardsAndUpdate结果合并到自定义对象中:

PasswordSignInAsync

答案 1 :(得分:1)

您必须处理单个线程中的所有项目。您可以通过在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);

       }