RxJava - последовательный вызов двух методов в фоновом режиме и возвращаемых значений в основном потоке - PullRequest
0 голосов
/ 05 июня 2018

Я хотел бы позвонить getNote в фоновом режиме.

После того, как я получу результат, который является Note объектом и все еще в фоновом режиме, я хотел бы взять два значения Note's - text_encrypted и date.

В конце концов я хотел бы вернуть их к следующему шагу и в главном потоке установить значения для двух textView.

Как я мог достичь этого?Вот мой код ниже.

Observable.fromCallable(() -> NotesDataBase.getNote(id))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .flatMap(notes -> {
        new Object[]{
                GeneratorAES.decrypt(notes.text_encrypted),
                CalendarUtils.showArticleTime(notes.date)
        };
    })
    .subscribe(objects -> {
        ((TextView) findViewById(R.id.text2)).setText(objects[0]);
        ((TextView) findViewById(R.id.text1)).setText(objects[1]);
    });

Я предполагаю, что я делаю что-то не так в первой flatMap, но я не уверен.

1 Ответ

0 голосов
/ 05 июня 2018

Это не должно компилироваться, поскольку flatMap() требует, чтобы вы возвращали наблюдаемое из вашей лямбды.Кроме того, observeOn() изменит поток для всех следующих операций цепочки.

Вместо этого вам придется вызывать observeOn() после ваших операций и только map() значения.Чтобы сделать его лучше, вы также можете использовать Pair вместо Object[]:

Observable.fromCallable(() -> NotesDataBase.getNote(id))
    .subscribeOn(Schedulers.io())
    .map(notes -> Pair.create(
                GeneratorAES.decrypt(notes.text_encrypted),
                CalendarUtils.showArticleTime(notes.date)))
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(pair -> {
        ((TextView) findViewById(R.id.text2)).setText(pair.first());
        ((TextView) findViewById(R.id.text1)).setText(pair.second());
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...