rxjava с для каждого цикла - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь получить данные из локальной базы данных по каждому содержимому асинхронно, но проблема в том, что я хочу получить данные в порядке их извлечения, сначала данные для первого компонента, чем для второго и т. Д., в настоящее время я получаю данные в неправильном порядке каждый раз, когда я запускаю код, как я могу добиться этого?

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

           }

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Для создания наблюдаемого потока из List<> вы можете использовать оператор Observable.fromIterable:

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

UPD :

Вы можете использовать zip оператор для объединения контента с результатом getScoreCardsAndUpdate в пользовательском объекте:

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());
            });
}
0 голосов
/ 23 мая 2018

Вам нужно будет обработать все элементы в одном потоке.Вы можете добиться этого, добавив планировщик в 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);

       }
...