使用 RxJava2 和普通空响应错误改造 2
Retrofit 2 with RxJava2 and plain null responses error
我用RxJava2 extension with Retrofit。
RxJava2观察者不支持在onNext
函数中省略null
当我用错误的输入调用网络服务或网络服务出现任何问题时,我得到简单的 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.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.access1(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)
如何解决此类问题的发生?
你可以在这里看到我的回答:
Querying single database row using rxjava2
简而言之,您可以将 Maybe 与 RxJava2 一起使用或发出预期结果的 Optional
。
您可以使用 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;
}
});
希望这对您有所帮助。
对不起我的英语。
我用RxJava2 extension with Retrofit。
RxJava2观察者不支持在onNext
函数中省略null
当我用错误的输入调用网络服务或网络服务出现任何问题时,我得到简单的 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.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.access1(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)
如何解决此类问题的发生?
你可以在这里看到我的回答:
Querying single database row using rxjava2
简而言之,您可以将 Maybe 与 RxJava2 一起使用或发出预期结果的 Optional
。
您可以使用 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;
}
});
希望这对您有所帮助。
对不起我的英语。