2015-02-10 5 views
13

Próbuję zlokalizować brakujący obiekt onError() w projekcie. Oznacza to, że aplikacja ulega awarii, ponieważ subskrypcja nie radzi sobie z podsłuchami, więc chcę zlokalizować tę subskrypcję i dodać metodę onError.Znajdź brakujący element w projekcie w projekcie

Niestety StackTrace nie jest naprawdę pomocny tutaj i to tylko pokazuje linię throw new IOException ale nic więcej:

FATAL EXCEPTION: main 
    Process: my.app.example.dev, PID: 20309 
    java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread. 
      at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:54) 
      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(Native Method) 
      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) 
    Caused by: rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError 
      at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:201) 
      at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:111) 
      at rx.android.app.OperatorConditionalBinding$1.onError(OperatorConditionalBinding.java:69) 
      at rx.internal.operators.NotificationLite.accept(NotificationLite.java:147) 
      at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:177) 
      at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.access$000(OperatorObserveOn.java:65) 
      at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:153) 
      at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:47) 
            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(Native Method) 
            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) 
    Caused by: rx.exceptions.CompositeException: 2 exceptions occurred. 
            at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:201) 
            at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:111) 
            at rx.android.app.OperatorConditionalBinding$1.onError(OperatorConditionalBinding.java:69) 
            at rx.internal.operators.NotificationLite.accept(NotificationLite.java:147) 
            at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:177) 
            at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.access$000(OperatorObserveOn.java:65) 
            at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:153) 
            at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:47) 
            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(Native Method) 
            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) 
    Caused by: rx.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received => 
      at com.splunk.mint.ExceptionHandler.uncaughtException(ExceptionHandler.java:42) 
      at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 
      at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 
      at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:58) 
            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(Native Method) 
            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) 
    Caused by: retrofit.RetrofitError: java.io.IOException: No connectivity 
      at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:385) 
      at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:221) 
      at retrofit.RestAdapter$RestHandler$1.call(RestAdapter.java:271) 
      at retrofit.RestAdapter$RestHandler$1.call(RestAdapter.java:269) 
      at retrofit.RxSupport$2.run(RxSupport.java:46) 
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
      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) 
    Caused by: java.io.IOException: No connectivity 
      at my.app.example.manager.ApiManager$NetworkAwareOKClient.execute(ApiManager.java:1071) 
      at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:322) 
            at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:221) 
            at retrofit.RestAdapter$RestHandler$1.call(RestAdapter.java:271) 
            at retrofit.RestAdapter$RestHandler$1.call(RestAdapter.java:269) 
            at retrofit.RxSupport$2.run(RxSupport.java:46) 
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
            at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
            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) 

Wszelkie pomysły, aby zlokalizować subskrypcji (linia w kodzie), że nie ma onError()?

Odpowiedz

23

To może być trudny do debugowania. Co zabawne miałem błąd wewnątrz Action1<Throwable> [facepalm].

Najlepiej było debugować, aby zarejestrować globalną procedurę obsługi błędów. Będzie to widział prawdę w kodzie:

RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() { 
     @Override 
     public void handleError(Throwable e) { 
      Log.w("Error",e); 
     } 
});  

dyskusja na github: https://github.com/ReactiveX/RxJava/issues/2293

+0

dodając ten kawałek kodu rozwiązuje problem –

+1

dodałem powyższy kod, a ja nie dostałem komunikat o błędzie log.w, ale aplikacja nadal ma awarię. Czy zrobiłem coś nie tak? – User9527

+0

@ User9527 usunąłeś wywołanie subskrypcji od subskrybenta (onNext, onError, onComplete)? Jeśli nie, powinieneś to zrobić :) – Diolor

1

Jeśli onError nie jest realizowany, a następnie RxJava rzucać OnErrorNotImplementedException wyjątek. Wygląda na to, że RxJava nie zadzwonił na metodę onError ("Wystąpił błąd podczas próby propagacji błędu do Observer.onError")

Możesz spróbować zarejestrować procedurę obsługi błędów, aby znaleźć wyjątek główny.

static { 
    RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() { 
     @Override 
     public void handleError(Throwable e) { 
      e.printStackTrace(); 
     } 
    }); 
}