RxJava group two responses one of which might be NULL with zip operator

北慕城南 提交于 2019-12-25 02:33:00

问题


I want to make two concurent request to Realm database and return results with RxJava. The issue is that one of requests can return NULL object and I have a crash. How can I properly return results from both DB even if one of them NULL? Thanks.

public void getDataFromTwoSources(DisposableObserver<ComplexUserDto> observer, String shopId) {
        Preconditions.checkNotNull(observer);

        final Observable<ComplexUserDto> observable = Observable.zip(firstRepository.getUserData(userId), secondRepository.getUserDetailData(userId),
                (userData, userDetails) -> {
                    ComplexUserDto resultDto = new ComplexUserDto(userData, userDetails);
                    return resultDto;
                })
                .compose(rxTransformers.applyUnauthorizedHandler())
                .compose(rxTransformers.applySchedulers());
        addDisposable(observable.subscribeWith(observer));
    }

public class ComplexUserDto {
    private UserData userData;
    private UserDetailData userDetailData;

    public ComplexUserDto(UserData userData, UserDetailData userDetailData) {
        this.userData = userData;
        this.userDetailData = userDetailData;
    }

    public UserData getUserData() {
        return userData;
    }

    public UserDetailData getUserDetailData() {
        return userDetailData;
    }
}

Exception:

java.lang.NullPointerException: onNext called with null. Null values are generally not allowed in 2.x operators and sources.
        at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onNext(ObservableCreate.java:63)
        at com.yozhik.data.database.shop.RealmDatabaseManagerImpl.lambda$null$15$RealmDatabaseManagerImpl(RealmDatabaseManagerImpl.java:261)
        at com.yozhik.data.database.shop.RealmDatabaseManagerImpl$$Lambda$15.execute(Unknown Source)
        at io.realm.Realm$1.run(Realm.java:1502)
        at io.realm.internal.async.BgPriorityRunnable.run(BgPriorityRunnable.java:34)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)

回答1:


You can return Optional from DB and then check if it's present.



来源:https://stackoverflow.com/questions/50334430/rxjava-group-two-responses-one-of-which-might-be-null-with-zip-operator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!