我试图通过每个内容asyncrounous从本地数据库获取数据,但问题是我想按照我检索的顺序获取数据,首先是第一个数据的数据,而不是第二个等。 ,目前我每次运行代码时都会以错误的顺序获取数据,我该如何实现?
for (Content content : contents) {
scoreCardDisposable = AppManagers.getContentManager()
.getScoreCardsAndUpdate(content.getId())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(scoreCards -> {
...
});
compositeDisposable.add(scoreCardDisposable);
}
答案 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);
}