使用 RxJava2 时收到错误“可调用返回 null”

我在我的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;   
       });
}

从可观察量来看,我在 DisposableObserver 的 onError 方法中遇到了以下错误

Callable returned null

这在使用RxJava时没有发生过。


答案 1

我曾经有这样的代码:

Observable<R> obs = Observable.fromCallable(this::work);

work() 可能会返回,正如您所指出的,RxJava 2 对此并不满意。null

方法 1

Observable<R> obs = Maybe.fromCallable(this::work).toObservable();

通过这种方式,最终消费者 - 观察者 - 只有在work()有任何东西要返回时才会启动。如果 work() 返回 null,则与订阅空观察者相同;没有任何反应。

方法 2

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

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

    e.onComplete();
});

方法 3:

出于多种原因,将每个发射包装在=坏主意中。Optional

主要是因为我只在我的API中使用Anfedsable,如果它是预期的,并且有点像“正常”场景,你时不时地得到一个空值。如果 null 不是预期的或非常罕见的,也许是同一个使用者执行的另一个 API 调用的直接结果,那么我返回 null 并让使用者在这些特殊情况下处理它,而不是让每个使用者都处理 Optional 到处都是。


答案 2

正如维基中给出的:

2.0 中的不同之处

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

这样做主要是为了避免由于应用程序中而导致的崩溃。NullPointerException

我通过一个相当简单的方法解决了这个问题。我检查了值是否为空,如果是,则将空值替换为占位符对象。

还存在其他更复杂的方法来解决此问题,但对于我的用例,这种简单的方法就足够了。


推荐