使用RxJava2时出现错误"Callable返回null"

pri*_*vex 8 java android reactive-programming rx-java rx-java2

我在我的android项目中使用RxJava2.

我正在使用以下代码来创建 Observable

public Observable<AlbumDetails> loadAlbumFromAlbumId(final String albumId) {
    return Observable.fromCallable(new Callable<AlbumDetails>() {
        @Override
        public AlbumDetails call() throws Exception {
             AlbumDetails albumDetails = getAlbumDetails(albumId);     
             return albumDetails;   
       });
}
Run Code Online (Sandbox Code Playgroud)

从observable,我在DisposableObserver的onError方法中遇到以下错误

Callable returned null

使用RxJava时不会发生这种情况.

pri*_*vex 7

正如维基中所给出的那样:

2.0中有什么不同

RxJava 2.x不再接受空值.将null作为流元素会NullPointerException立即生成,因此会调用onError方法.

这主要是为了避免NullPointerException应用程序中的崩溃.

我用一种相当简单的方法解决了这个问题 我检查了值是否为null,如果是,我用占位符对象替换了null.

还有其他更复杂的方法可以解决这个问题,但对于我的用例,这种简单的方法就足够了.


Mar*_*son 6

我曾经有这样的代码:

Observable<R> obs = Observable.fromCallable(this::work);
Run Code Online (Sandbox Code Playgroud)

work()可能会返回,null并且如您所述,RxJava 2对此不满意。

方法1

Observable<R> obs = Maybe.fromCallable(this::work).toObservable();
Run Code Online (Sandbox Code Playgroud)

这样,最终用户(观察者)只有在work()有任何可返回的东西时才开始。如果work()返回null,则与订阅一个空的Observer相同;没发生什么事。

方法2

Observable<R> obs = Observable.create(e -> {
    R r = work();

    if (r != null) {
        e.onNext(r);
    }

    e.onComplete();
});
Run Code Online (Sandbox Code Playgroud)

方法3:

Optional由于种种原因,将每个排放都包装成一个坏主意。

主要是因为我仅在期望的情况下在我的API中使用Optional,并且在某种“正常”情况下,您有时会得到null。如果不是预期的或非常少的null,可能是由于同一使用者执行另一个API调用的直接结果,那么我返回null并让使用者在这些特殊情况下处理它,而不是让每个使用者都在整个过程中处理Optional。地点。