2016-04-19 11 views
5

com.myapp.test.debug E/kolejka komunikatów-JNI: rx.exceptions.OnErrorNotImplementedException na rx.Observable $ 31.onError (Observable.java: 7134) w rx.observers.SafeSubscriber._onError (SafeSubscriber.java:154) w rx.observers.SafeSubscriber.onError (SafeSubscriber.java:111) w rx.observers.SafeSubscriber.onNext (SafeSubscriber.java:137) w rx.subjects.SubjectSubscriptionManager $ SubjectObserver.onNext (SubjectSubscriptionManager.java:224) w rx.subjects.PublishSubject.onNext (PublishSubject.java:121) at com.myapp.MyClass.lambda $ statyczny 53 $ (MyClass.java:77) gdzie MyClass.java 77 MySubject.onNext (zdarzenie);rx.exceptions.OnErrorNotImplementedException Jak uniknąć tego błędu - jej upaść moim app

Kilka pytań ... Dlaczego nie jest wyświetlany faktyczny błąd oprócz obsługi błędu? Po drugie, gdzie mam przypuszczać, że będę realizować tę funkcję na mój temat? Jak dokładnie powinienem dodać moduł obsługi błędów do tematu. Dzięki temu powoduje awarię mojej aplikacji i faktyczny błąd nie jest nawet wyświetlany. Chyba powinienem zawsze zaimplementować obsługę błędów?

+0

której używasz wersji RxJava? Możesz dodać obsługę błędów w swoim strumieniu, wprowadzając wywołanie zwrotne onError w swoim Observable. Przykład: 'suject.subscribe (onNextCallback, onErrorCallback);' – dwursteisen

Odpowiedz

4

RxJava ma Observable i Observer. Możesz zobaczyć Observable jako źródło swojego strumienia, na którym możesz wykonywać operacje takie jak map i filter. Observer jest rodzajem odbiornika : jest to interfejs z trzema metodami (onNext, onError i onCompleted), które są wyzwalane przez Observable. Podłączysz metody Observable i Observer za pomocą metod.

Istnieje wiele przeciążenia subscribe które pozwalają zapewnić onNext, onError i onCompleted jako odrębne funkcje. Te funkcje są następnie wykorzystywane do implementacji interfejsu Observer. Jeśli nie zapewnisz wszystkich trzech funkcji (powiedzmy tylko onNext), metoda onError interfejsu zostanie zaimplementowana przez wyrzucenie OnErrorNotImplementedException.

Przypuszczalnie Twój kod wyglądać tak

PublishSubject<Integer> subject = PublishSubject.create(); 
subject.subscribe(System.out::println); // I use a Java 8 lambda here for brevity 
subject.onNext(1/0); // this causes an error for dividing by 0 

Można „haczyk” to wyjątek, nie tylko zapewniając realizację onNext w subscribe, ale również zapewnienie onError realizacji:

PublishSubject<Integer> subject = PublishSubject.create(); 
subject.subscribe(System.out::println, Throwable::printStacktrace); 
subject.onNext(1/0); 

Odnośnie ostatniego pytania "Czy mam zawsze realizować funkcję onError? ": Technicznie rzecz biorąc nie, nie musisz, jeśli masz pewność, że Observable (lub Subject) nie spowoduje błędu. W praktyce jednak dobrym pomysłem jest przynajmniej zarejestrowanie tego rodzaju błędu, a nawet odzyskanie go za pomocą operatora takiego jak onErrorResumeNext lub retry. Możesz znaleźć o nich wszystko w documentation.

0

Należy pamiętać o subskrypcjach, które mogą powodować błędy. Na przykład mam subskrypcję wykonującą assert, który zwrócił wartość true za pierwszym razem, ale gdy następna wartość spowodowała, że ​​asercja spowodowała błąd, moja obserwacja została złapana z tym błędem wyjątku.

Powiązane problemy