2017-03-06 38 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