2016-07-26 13 views
0

Ich bekomme einen Absturz, während ich einen Netzwerkanruf mit Retrofit mache. Hier ist mein Stacktrace.Schwerwiegende Ausnahme: java.lang.IllegalStateException: Schwerwiegende Ausnahme auf Scheduler.Worker-Thread geworfen

Fatal Exception: java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread. 
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5584) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
     at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by rx.b.i: Error occurred when trying to propagate error to Observer.onError 
     at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:2192) 
     at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71) 
     at rx.observers.SerializedObserver.onError(SerializedObserver.java:158) 
     at rx.observers.SerializedSubscriber.onError(SerializedSubscriber.java:79) 
     at rx.internal.operators.OperatorTakeUntil$1.onError(OperatorTakeUntil.java:49) 
     at rx.internal.operators.OperatorToObservableList$1.onError(OperatorToObservableList.java:99) 
     at rx.internal.operators.OperatorFilter$1.onError(OperatorFilter.java:47) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:243) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:779) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:540) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:529) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.onError(OperatorMerge.java:253) 
     at rx.internal.operators.OperatorMap$1.onError(OperatorMap.java:48) 
     at rx.internal.operators.OnSubscribeRedo$4$1.onError(OnSubscribeRedo.java:331) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:243) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:779) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:540) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:529) 
     at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:813) 
     at rx.Observable$ThrowObservable$1.call(Observable.java:11200) 
     at rx.Observable.unsafeSubscribe(Observable.java:8314) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:7235) 
     at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:54) 
     at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:54) 
     at rx.internal.operators.OnSubscribeRedo$3$1.onNext(OnSubscribeRedo.java:1307) 
     at rx.internal.operators.NotificationLite.accept(NotificationLite.java:150) 
     at rx.subjects.SubjectSubscriptionManager$SubjectObserver.emitNext$a2d69e2(SubjectSubscriptionManager.java:253) 
     at rx.subjects.BehaviorSubject.onNext(BehaviorSubject.java:160) 
     at rx.internal.operators.OnSubscribeRedo$2$1.onError(OnSubscribeRedo.java:242) 
     at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:254) 
     at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:186) 
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5584) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
     at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by rx.b.a: 2 exceptions occurred. 
     at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:2192) 
     at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71) 
     at rx.observers.SerializedObserver.onError(SerializedObserver.java:158) 
     at rx.observers.SerializedSubscriber.onError(SerializedSubscriber.java:79) 
     at rx.internal.operators.OperatorTakeUntil$1.onError(OperatorTakeUntil.java:49) 
     at rx.internal.operators.OperatorToObservableList$1.onError(OperatorToObservableList.java:99) 
     at rx.internal.operators.OperatorFilter$1.onError(OperatorFilter.java:47) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:243) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:779) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:540) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:529) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.onError(OperatorMerge.java:253) 
     at rx.internal.operators.OperatorMap$1.onError(OperatorMap.java:48) 
     at rx.internal.operators.OnSubscribeRedo$4$1.onError(OnSubscribeRedo.java:331) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:243) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:779) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:540) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:529) 
     at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:813) 
     at rx.Observable$ThrowObservable$1.call(Observable.java:11200) 
     at rx.Observable.unsafeSubscribe(Observable.java:8314) 
     at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:7235) 
     at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:54) 
     at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:54) 
     at rx.internal.operators.OnSubscribeRedo$3$1.onNext(OnSubscribeRedo.java:1307) 
     at rx.internal.operators.NotificationLite.accept(NotificationLite.java:150) 
     at rx.subjects.SubjectSubscriptionManager$SubjectObserver.emitNext$a2d69e2(SubjectSubscriptionManager.java:253) 
     at rx.subjects.BehaviorSubject.onNext(BehaviorSubject.java:160) 
     at rx.internal.operators.OnSubscribeRedo$2$1.onError(OnSubscribeRedo.java:242) 
     at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:254) 
     at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:186) 
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5584) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
     at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by rx.b.b: Chain of Causes for CompositeException In Order Received => 
     at com.crashlytics.android.core.SessionProtobufHelper.getEventAppExecutionExceptionSize(SessionProtobufHelper.java:619) 
     at com.crashlytics.android.core.SessionProtobufHelper.getEventAppExecutionExceptionSize(SessionProtobufHelper.java:622) 
     at com.crashlytics.android.core.SessionProtobufHelper.getEventAppExecutionExceptionSize(SessionProtobufHelper.java:622) 
     at com.crashlytics.android.core.SessionProtobufHelper.getEventAppExecutionSize$322e56cf(SessionProtobufHelper.java:554) 
     at com.crashlytics.android.core.SessionProtobufHelper.getEventAppSize$565823c3(SessionProtobufHelper.java:510) 
     at com.crashlytics.android.core.SessionProtobufHelper.getSessionEventSize(SessionProtobufHelper.java:2482) 
     at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.writeSessionEvent$13f1f7ff(CrashlyticsUncaughtExceptionHandler.java:1052) 
     at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.writeFatal(CrashlyticsUncaughtExceptionHandler.java:23766) 
     at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler$5.call(CrashlyticsUncaughtExceptionHandler.java:1238) 
     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 io.fabric.sdk.android.services.common.ExecutorUtils$1$1.onRun(ExecutorUtils.java:75) 
     at io.fabric.sdk.android.services.common.BackgroundPriorityRunnable.run(BackgroundPriorityRunnable.java:30) 
     at java.lang.Thread.run(Thread.java:841) 
Caused by retrofit.RetrofitError 
     at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:395) 
     at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) 
     at $Proxy4.getChartStockData(Unknown Source) 
     at com.talkoot.android.web.GoogleFinanceManager.access$lambda$0(GoogleFinanceManager.java:1082) 
     at com.talkoot.android.web.GoogleFinanceManager$$Lambda$1.call(Unknown Source) 
     at rx.internal.operators.OnSubscribeFromCallable.call(OnSubscribeFromCallable.java:1032) 
     at rx.Observable$2.call(Observable.java:1162) 
     at rx.Observable.unsafeSubscribe(Observable.java:8314) 
     at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) 
     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:841) 
Caused by java.net.SocketTimeoutException 
     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:491) 
     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
     at java.io.InputStream.read(InputStream.java:162) 
     at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142) 
     at java.io.BufferedInputStream.read(BufferedInputStream.java:227) 
     at com.android.okhttp.internal.Util.readAsciiLine(Util.java:316) 
     at com.android.okhttp.internal.http.RawHeaders.fromBytes(RawHeaders.java:308) 
     at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:135) 
     at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:644) 
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347) 
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503) 
     at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73) 
     at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38) 
     at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326) 
     at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) 
     at $Proxy4.getChartStockData(Unknown Source) 
     at com.talkoot.android.web.GoogleFinanceManager.access$lambda$0(GoogleFinanceManager.java:1082) 
     at com.talkoot.android.web.GoogleFinanceManager$$Lambda$1.call(Unknown Source) 
     at rx.internal.operators.OnSubscribeFromCallable.call(OnSubscribeFromCallable.java:1032) 
     at rx.Observable$2.call(Observable.java:1162) 
     at rx.Observable.unsafeSubscribe(Observable.java:8314) 
     at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) 
     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:841) 

Hier ist mein Code.

public void downloadChartFullData(@NonNull String ticker, @NonNull String exchange, @NonNull ChartTimePeriod chartTimePeriod, 
             @NonNull ChartFragment fragment) { 
     if (!ConnectionUtils.isNetworkConnected(false)) 
      return; 
     Log.v(TAG + Utils.getCurrentThreadInfo(), "handleActionDownloadChartStockData"); 
     getChartStockData(ticker, exchange) 
       .compose(fragment.bindToLifecycle()) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .retryWhen(RetryWithDelay.newInstance()) 
       .flatMap(new Func1<List<ChartDataEntity>, Observable<ChartDataEntity>>() { 
        @Override 
        public Observable<ChartDataEntity> call(List<ChartDataEntity> stockEntities) { 
         return Observable.from(stockEntities); 
        } 
       }) 
       .filter(new Func1<ChartDataEntity, Boolean>() { 
        @Override 
        public Boolean call(ChartDataEntity ChartDataEntity) { 
         return ChartDataEntity.getDate() != null; // to filter out data without Date. 
        } 
       }) 
       .toList() 
       .compose(fragment.bindToLifecycle()) 
       .doOnNext(new Action1<List<ChartDataEntity>>() { 
        @Override 
        public void call(List<ChartDataEntity> stockEntities) { 
         mBus.post(new OnChartDataReceivedEvent(TAG, stockEntities, ticker, exchange, 
           chartTimePeriod)); 
        } 
       }) 
       .subscribe(new Action1<List<ChartDataEntity>>() { 
        @Override 
        public void call(List<ChartDataEntity> stockEntities) { 
        } 
       }, new Action1<Throwable>() { 
        @Override 
        public void call(Throwable throwable) { 
         Log.e("TAG", throwable.getMessage()); 
        } 
       }); 
    } 

public Observable<List<ChartDataEntity>> getChartStockData(@NonNull String ticker, @NonNull String exchange) { 
     return Observable.fromCallable(() -> { 
      Log.i(TAG + Utils.getCurrentThreadInfo(), "Getting stockChart"); 
      Response response = mGoogleFinanceWebInterface.getChartStockData(ticker, exchange, 
        GoogleFinanceWebInterface.INTERVAL_DEFAULT, GoogleFinanceWebInterface.PERIOD_DEFAULT, 
        new GoogleFinanceWebInterface.ChartParameters()); 
      String strResponse = responseMapper.call(response); 
      return StockUtils.convertResponseToChartData(strResponse); 
     }); 
    } 

Jede Hilfe wäre willkommen.

+0

Sie eine Timeout-Ausnahme von Ihnen Verbindung bekommen. Testen Sie den API-Aufruf im Postboten und sehen Sie, ob es funktioniert – SoroushA

+0

Ja, ich weiß, dass ich eine Ausnahme für Zeitüberschreitung bekomme. Ich möchte das in meinem Rx-Code behandeln. Ich erwarte jeden Fehler in der abrufbaren Call-of-Subscribe-Methode. Aber warum stürzt dieser ab, anstatt zu werfen Anruf zu abonnieren. – WonderKid

+0

Sind Sie sicher, dass Sie onError at RestAdapter.java:395 korrekt aufrufen? – SoroushA

Antwort

0

Es scheint, wie Sie Mainthread kurz vor zweiten komponieren Operator beginnen müssen es, weil Retrofit bezogene Ausführung auf demselben Thread sein sollte.

so diese Zeile hinzufügen

.observeOn(AndroidSchedulers.mainThread()) 

kurz nach toList()

+0

Ich hatte es tatsächlich gelöst die Ausnahme in OnErrorReturn Callback behandeln. Ich konnte es in onError nicht machen, weil es eine CompositeException war, die ich kürzlich in RxJava gelöst habe, aber noch nicht in RxAndroid enthalten war. Vielen Dank für Ihre Antwort. Aber in meinem Fall wurden Retrofit-Anrufe im Hintergrund abgewickelt und es funktioniert perfekt. Die Ausnahme tritt auf, wenn ein Problem mit dem Internet/Server besteht, mit dem wir trotzdem umgehen müssen. Vielen Dank. – WonderKid

+0

es ist in Ordnung, eigentlich hatte ich gleiche Ausnahme einige Tage zurück und ich löste es so, wie ich in Antwort erwähnt. also dachte ich, es wäre auch hilfreich für dich. –

Verwandte Themen