【问题标题】:Retrofit 2 with RxJava2 and plain null responses error改造 2 与 RxJava2 和纯空响应错误
【发布时间】:2017-03-06 21:16:01
【问题描述】:

我使用RxJava2 extension with Retrofit

RxJava2 观察者不支持在 onNext 函数中省略 null

当我使用错误的输入调用 web 服务或 web 服务出现任何问题时,我会得到简单的 null 作为响应。

我认为,然后作为 null 传递给 rx2 observable。

这是我得到的错误:

java.lang.NullPointerException: Null is not a valid element
        at io.reactivex.internal.queue.SpscLinkedArrayQueue.offer(SpscLinkedArrayQueue.java:68)
        at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.onNext(ObservableObserveOn.java:116)
        at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.java:63)
        at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)
        at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
        at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:43)
        at io.reactivex.Observable.subscribe(Observable.java:10179)
        at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
        at io.reactivex.Observable.subscribe(Observable.java:10179)
        at io.reactivex.internal.operators.observable.ObservableSubscribeOn$1.run(ObservableSubscribeOn.java:39)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

如何解决此类问题的发生?

【问题讨论】:

    标签: android retrofit retrofit2 rx-java2


    【解决方案1】:

    你可以使用 Completable 代替 Observable ,它不允许响应请求。

    编辑:

    也许您可以使用Map 运算符来检查该值是否为空,并在这种情况下发送一个默认值。

    Observable<MyClass> observable = myRetrofitService().map(new Function<MyClass, MyClass>() {
                @Override public MyClass apply(MyClass o) throws Exception {
                    if (o == null) {
                        return defaultO;
                    }
                    return o;
                }
            });
    

    如果您不关心发出值,也许您可​​以使用过滤运算符:

    Observable<MyClass> observable = myRetrofitService().filter(new Predicate<MyClass>() {
                @Override public boolean test(MyClass o) throws Exception {
                    return o != null;
                }
            });
    

    希望这会有所帮助。

    对不起我的英语。

    【讨论】:

    • @yosriz 让我知道它是否解决了您的问题或者您有什么问题
    • 好吧,这不是我的问题,而是@MBH,无论如何我认为 Completable 还不够,因为您自然希望通过网络请求进行价值发射
    • @yosriz 如果您想更新或删除服务器上的内容,您可能只是对成功或错误感兴趣,在这种情况下,例如没有向客户端发出值。
    • 当然,我会这样做的。
    • 我已经编辑了一个例子,如果你给我一些细节我可以适应它。
    【解决方案2】:

    你可以在这里看到我的回答:
    Querying single database row using rxjava2
    简而言之,您可以将 Maybe 与 RxJava2 一起使用,或者发出预期结果的 Optional

    【讨论】:

    • 但是 Retrofit 有它的 RxJava2 扩展,它只使用 Observable。
    • 这不是真的,可能在 RxJava2 适配器的可用类型列表中,请查看您的链接
    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多