2017-03-06 35 views
1

我使用RxJava2 extension with Retrofit使用RxJava2和普通空响应进行改装2错误

RxJava2观察家不支持onNext功能省略null

当我通过错误的输入调用webservice或者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) 

如何发生解决这个问题?

回答

1

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

编辑:

也许你可以使用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; 
      } 
     }); 

希望这有助于。

对不起,我的英语。

+0

@yosriz让我知道它是否已解决您的问题或者是否有任何问题 – Cochi

+0

好吧,这不是我的问题,而是@MBH,无论如何我不认为Completable就足够了,因为您希望通过网络请求获得价值辐射 – yosriz

+0

@yosriz如果您想要更新或删除服务器上的内容,那么您可能只是对成功或错误感兴趣,例如在这种情况下没有发送给客户的价值。 – Cochi

1

你可以看到我的答案在这里:
Querying single database row using rxjava2
总之 ,您可以使用Maybe与RxJava2或发出预期结果的Optional

+0

但是Retrofit的RxJava2扩展只使用Observable。 – MBH

+0

这不是真的,也许是在RxJava2适配器的可用类型列表中,请参阅您的链接 – yosriz