android - 使用 RxJava2 和普通空响应错误进行改造 2

标签 android retrofit retrofit2 rx-java2

我使用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)

出现这样的问题如何解决?

最佳答案

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

编辑:

也许你可以使用Map运算符检查值是否为 null,并在本例中发送默认值。

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

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

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

希望这有帮助。

抱歉我的英语不好。

关于android - 使用 RxJava2 和普通空响应错误进行改造 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42624420/

相关文章:

android - 如何在 Retrofit 1.9 中执行同步 api 调用

java - 创建 Java 类来接收 JSON 对象

php - 在数字前使用 {%2B) 而不是 (+) 有什么区别?

android - 应用内计费错误

android - 如何让相机出现在android的特定屏幕区域?

android - 在 Windows 中为 Android 编译 .cpp 文件

java - 使用 Retrofit2 调用电话时没有收到任何响应

android - 如何在我的应用程序中使用 Google map 搜索功能 api?

Android:Retrofit/Volley 是如何优于 AsyncTask 的

android - 如何在 kotlin 协程上进行指数退避重试