Как связать задачи в RxJava - PullRequest
3 голосов
/ 24 апреля 2019

Я работаю над регистрацией приложений для Android, в которой мне нужно выполнить несколько задач, одна за другой, скажем,

задача1
задача2
задача3

Я хочуцепочка этих задач одна за другой, и если задача не была выполнена, весь процесс должен быть с ошибкой ..

Я хочу решить эту проблему с помощью Rxjava, может кто-нибудь сказать мне, как этого добиться с помощью rxJava.


(я потратил 5 часов, но не нашел решения и новичку в RxJava)

Что я пытался

Observable.merge(task1,task2,task3).subscribe(new Observer<DataError>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(DataError dataError) {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {
             //this method is not called by rxJava
            }
        });

этим методомвсе работает нормально, но метод onComplete() не вызывается rxJava.

Пожалуйста, помогите ~

Редактировать -
Каждая задача зависит от результата предыдущей задачи.и должно быть одно задание за один раз.

1 Ответ

2 голосов
/ 24 апреля 2019

Допустим, у нас есть 3 задачи. Из заданного массива целых чисел, найти четные числа, умножить каждое четное число на 10, разделить каждое число на 2

//A stream of observable to find even numbers
private Observable<Integer> findEven(Integer number) {
    return Observable
        .just(number)
        .filter(data -> data % 2 == 0);
}

//A stream of observable to multiply each number with 10
private Observable<Integer> multiplyBy10(Integer evenNumber) {
    return Observable.just(evenNumber).map(data -> data * 10);
}

//A stream of observable to divide each number with 2
private Observable<Integer> divideBy2(Integer evenNumber) {
    return Observable.just(evenNumber).map(data -> data / 2);
}

Итак, как нам связать эту задачу?

Observable
    .just(1, 2, 3, 4, 5, 6, 7, 8)
    //find even numbers
    .flatMap(num -> findEven(num))
    //Now multiply each even number by 10
    .flatMap(num -> multiplyBy10(num))
    //Now to each number divide 2 
    .flatMap(num -> divideBy2(num))
    .subscribe(
        // result: 10, 20, 30, 40
        result -> Log.v("", "result: " + result),
        error -> Log.e("", error.getMessage())
    );

Надеюсь, это поможет.

...