rxJava: запускать код, только если все Flowables были использованы - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть два FLowable объекта.Мне нужно выполнить некоторый код, когда все они потребляются.Кроме того, мне нужно выполнить код, когда любой из Flowables обновляется.Мне не нужно выполнять какие-либо функции карты (они не нужны).

Я пытался использовать что-то вроде кода ниже

Я думаю, что это очень-очень неправильно делать подобным образом

Flowable<User> user = mDataRepo.getUser();
Flowable<Goal> goal = mDataRepo.getGoal();
Disposable userDisposable = user
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(user -> {

            Disposable goalDisposable = goal
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(goal -> {

                        // do my things with user and goal

                    }, Throwable::printStackTrace);
            mDisposable.add(goalDisposable);

        }, Throwable::printStackTrace);
mDisposable.add(userDisposable);

Вот пример не Rx

mData.getUser(new AppDataSourceOld.GetUserCallback() {
    @Override
    public void onUserLoaded(@NonNull User user) {

        mData.getActiveGoal(new AppDataSourceOld.GetGoalCallback() {
            @Override
            public void onLoaded(@Nullable Goal goal) {

                // do my things with user and goal

            }
        });

    }
});

Отредактировано:

Решение, вдохновленное @ akarnokd

Flowable<User> user = mDataRepo.getUser();
Flowable<Goal> goal = mDataRepo.getGoal();
user.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .zipWith(goal, new BiFunction<User, Goal, Object>() {
            @Override
            public Object apply(User user, Goal goal) throws Exception {
                // do my things with user and goal

                return 1;
            }
        })
        .subscribe();

Это выглядит лучше.Но!Мне нужно что-то вернуть.Потому что результат zipWith() не должен быть нулевым, если он - я получаю java.lang.NullPointerException: The zipper returned a null value

Итак, это не кажется мне идеальным, и я думаю, что что-то упустил.

1 Ответ

0 голосов
/ 05 февраля 2019

На самом деле я думаю, что вам нужно использовать Flowable.combineLatest() вместо .zip.Поскольку zip не соответствует вашему запросу "Кроме того, мне нужно выполнить код, когда обновится любой из Flowables".Таким образом, у вас будет что-то вроде:

Flowable.combineLatest(user, goal, { u, g -> 
    // do my things with user and goal
    return 1;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
...