2015-10-08 10 views
8

Ich verwende Retrofit 2.0.0-beta2 mit RxJava 1.0.14. Ich behandle Fehler auf diese Weise, weil ich einige Codes in doFinally muß auszuführen:Observable.empty() verursacht java.util.NoSuchElementException: Sequenz enthält keine Elemente

.onErrorResumeNext(Observable.empty());

Aber wenn ich eine HTTP-Antwort mit einem Fehler (401 zum Beispiel) meine App stürzt ohne meine Klassen in dem Stack-Trace . Nichts Schlimmes passiert, wenn Sie Observable.never verwenden. Hier ist voller Stack-Trace:

java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling. 
at rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:60) 
at android.os.Handler.handleCallback (Handler.java:739) 
at android.os.Handler.dispatchMessage (Handler.java:95) 
at android.os.Looper.loop (Looper.java:135) 
at android.app.ActivityThread.main (ActivityThread.java:5221) 
at java.lang.reflect.Method.invoke (Unknown source) 
at java.lang.reflect.Method.invoke (Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:899) 
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694) 

rx.exceptions.OnErrorNotImplementedException: Sequence contains no elements 
at rx.Observable$27.onError (Observable.java:7535) 
at rx.observers.SafeSubscriber._onError (SafeSubscriber.java:154) 
at rx.observers.SafeSubscriber.onError (SafeSubscriber.java:111) 
at rx.internal.operators.OperatorDoOnEach$1.onError (OperatorDoOnEach.java:70) 
at rx.internal.operators.OperatorDoOnEach$1.onError (OperatorDoOnEach.java:70) 
at rx.internal.operators.OperatorDoOnEach$1.onError (OperatorDoOnEach.java:70) 
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue (OperatorObserveOn.java:197) 
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call (OperatorObserveOn.java:170) 
at rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:55) 
at android.os.Handler.handleCallback (Handler.java:739) 
at android.os.Handler.dispatchMessage (Handler.java:95) 
at android.os.Looper.loop (Looper.java:135) 
at android.app.ActivityThread.main (ActivityThread.java:5221) 
at java.lang.reflect.Method.invoke (Unknown source) 
at java.lang.reflect.Method.invoke (Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:899) 
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694) 

java.util.NoSuchElementException: Sequence contains no elements 
at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted (OperatorSingle.java:131) 
at rx.internal.operators.OperatorTake$1.onCompleted (OperatorTake.java:53) 
at rx.Observable$EmptyHolder$1.call (Observable.java:1077) 
at rx.Observable$EmptyHolder$1.call (Observable.java:1074) 
at rx.Observable.unsafeSubscribe (Observable.java:7710) 
at rx.internal.operators.OperatorOnErrorResumeNextViaObservable$1.onError (OperatorOnErrorResumeNextViaObservable.java:76) 
at rx.internal.operators.OperatorDoOnEach$1.onError (OperatorDoOnEach.java:70) 
at rx.internal.operators.OperatorSubscribeOn$1$1$1.onError (OperatorSubscribeOn.java:71) 
at rx.observers.SerializedObserver.onError (SerializedObserver.java:159) 
at rx.observers.SerializedSubscriber.onError (SerializedSubscriber.java:79) 
at rx.internal.operators.OperatorTakeUntil$1.onError (OperatorTakeUntil.java:49) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError (OperatorMerge.java:239) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate (OperatorMerge.java:774) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop (OperatorMerge.java:532) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.emit (OperatorMerge.java:521) 
at rx.internal.operators.OperatorMerge$InnerSubscriber.onError (OperatorMerge.java:808) 
at rx.Observable$ThrowObservable$1.call (Observable.java:9600) 
at rx.Observable$ThrowObservable$1.call (Observable.java:9590) 
at rx.Observable.unsafeSubscribe (Observable.java:7710) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext (OperatorMerge.java:231) 
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext (OperatorMerge.java:140) 
at rx.internal.operators.OperatorMap$1.onNext (OperatorMap.java:55) 
at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe.call (RxJavaCallAdapterFactory.java:113) 
at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe.call (RxJavaCallAdapterFactory.java:88) 
at rx.Observable$2.call (Observable.java:162) 
at rx.Observable$2.call (Observable.java:154) 
at rx.Observable$2.call (Observable.java:162) 
at rx.Observable$2.call (Observable.java:154) 
at rx.Observable$2.call (Observable.java:162) 
at rx.Observable$2.call (Observable.java:154) 
at rx.Observable.unsafeSubscribe (Observable.java:7710) 
at rx.internal.operators.OperatorSubscribeOn$1$1.call (OperatorSubscribeOn.java:62) 
at rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:55) 
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:422) 
at java.util.concurrent.FutureTask.run (FutureTask.java:237) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201 (ScheduledThreadPoolExecutor.java:152) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java:265) 
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587) 
at java.lang.Thread.run (Thread.java:818) 

Danke,
Anton

Antwort

29

Von dem Stack-Trace,

at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted (OperatorSingle.java:131) 
at rx.internal.operators.OperatorTake$1.onCompleted (OperatorTake.java:53) 

Dies zu take(1).single() entspricht, das ist auch der first() Bequemlichkeit Operator. Ich vermute, dass Sie das letztere verwenden, aber beide erfordern mindestens ein Element.

Mithilfe von empty() erstellen Sie eine Observable ohne Elemente, die den Vertrag der nachgeschalteten Operatoren verletzt. Geben Sie entweder einen Standardeintrag im onErrorResumeNext Observable aus oder ändern Sie Ihren Downstream-Code, um Streams ohne Elemente zu unterstützen.

+1

Wirklich, ich benutze zuerst(), herzlichen Dank! –

+0

Ich habe das gleiche Problem. Aber ich bin der Rückkehr eine leere Liste in 'Observable.concat (mDatabaseObs, mRetrofitObs, mLastObs) .onErrorReturn (throwable -> new Arraylist ()) \t \t .First (Daten -!> Data = null && Daten. isEmpty()) ' Nach meinem Verständnis sollte dies nur eine leere Liste ausgeben, wenn mRetrofitObs einen Fehler wirft, wird zuerst diese leere Liste finden und zum nächsten gehen. –

+0

Alter Thread, aber ich frage mich, ob .onErrorResumeNext (Observable.never()) würde dieses Problem lösen? – Incinerator

Verwandte Themen