У меня есть два 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
Итак, это не кажется мне идеальным, и я думаю, что что-то упустил.