抛出异常。添加onError处理

时间:2015-12-22 17:55:25

标签: android rx-java

我已经添加了onErrorReturn和doOnError,但我仍然会遇到致命的错误。这是我的代码:

 apiInterface.submitDataToAnalyze("dataToAnalyze", HelperFunctions.authenticationData, 1, uuid, dataToAnalyze.toString(), todayDate)
                                .onErrorReturn(new Func1<Throwable, BasicResponse>() {
                                    @Override
                                    public BasicResponse call(Throwable throwable) {
                                        Log.e(FILE_NAME, "submitDataToAnalyze throwable??");
                                        Log.e(FILE_NAME, throwable.getMessage().toString());
                                        return null;
                                    }
                                })
                                .flatMap(new Func1<BasicResponse, Observable<LocationSuggestion>>() {
                                    @Override
                                    public Observable<LocationSuggestion> call(BasicResponse basicResponse) {
                                        Log.v(FILE_NAME, "basicResponse: " + basicResponse.toString());
                                        if (basicResponse.getResult() == 1) {
                                            //update TABLE_REQUEST_SUGGESTIONS with serverResponse = 1
                                            dbc.updateRequestSuggestionLog(strTodayDate, strDataToAnalyze, basicResponse.getResult());
                                            return apiInterface.getSuggestion("getSuggestion", HelperFunctions.authenticationData, HelperFunctions.requestVersion, uuid,
                                                    strLocationLat, strLocationLng, radius, requestForDate);
                                        } else {
                                            return Observable.just(null);
                                        }
                                    }
                                }).doOnError(new Action1<Throwable>() {
                            @Override
                            public void call(Throwable t) {
                                Log.e(FILE_NAME, "masuk doOnError??");
                                Log.e(FILE_NAME, t.getMessage().toString());
                            }


                        }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe();

                }

具体来说,这是错误信息:

E/ISRS: masuk doOnError??
E/ISRS: masuk 22??
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:60)

附加信息:如果submitDataToAnalyze()由于连接错误而连接到我的服务器时出现问题,则会发生致命错误

1 个答案:

答案 0 :(得分:7)

onErrorReturn方法中,返回null,然后此null沿着链进一步传播。因此它会导致NPE(例如basicResponse.toString())。在这种情况下,doOnError被调用,但您的订阅者仍然处于Throwable状态,仍处于未处理状态。

因此,您必须通过Subscriber实施传递onError个实例。

另一个选择:在您的链中,您可以使用类似onErrorResumeNext(Observable.empty())的内容,因此它不会发出任何内容然后完成。在这种情况下,您无需将订阅者实现传递给subscribe