JsonChao / Awesome-WanAndroid

:zap:致力于打造一款极致体验的 http://www.wanandroid.com/ 客户端,知识和美是可以并存的哦QAQn(*≧▽≦*)n
Apache License 2.0
2.73k stars 605 forks source link

当onNext执行异常,不会正确调用onerror方法 #67

Closed tianminggh closed 6 years ago

tianminggh commented 6 years ago

onNext里面执行抛出异常,执行到了 Log.i("hh","yy");但是当执行 emitter.onError(e);的时候却没有执行BaseObserver的onError方法 请问这是原因呢?代码如下

RxUtils中: private static Observable createData(final T t) { return Observable.create(emitter -> { try { emitter.onNext(t); emitter.onComplete(); } catch (Exception e) { Log.i("hh","yy"); emitter.onError(e); } }); }

SearchListActivity中: @Override public void showSearchList(FeedArticleListData feedArticleListData) {

    feedArticleListData.getDatas().get(1000);//为了抛出异常,特意设置

    mArticleList = feedArticleListData.getDatas();
    if (isAddData) {
        if (mArticleList.size() > 0) {
            mAdapter.addData(mArticleList);
        } else {
            CommonUtils.showMessage(this, getString(R.string.load_more_no_data));
        }
    } else {
        mAdapter.replaceData(mArticleList);
    }
    showNormal();
}

:octocat: From gitme Android

JsonChao commented 6 years ago

Thank your issue, 在BaseObserver中有对error的处理有多种情况,可以在其中断点定位问题~

:octocat: From gitme Android

tianminggh commented 6 years ago

Thank your issue, 在BaseObserver中有对error的处理有多种情况,可以在其中断点定位问题~

:octocat: From gitme Android

根本不会走到BaseObserver的error方法

JsonChao commented 6 years ago

可以debug看下,是否进入了此方法,再看其中的流程处理~ @Override public void onError(Throwable e) { if (mView == null) { return; } if (mErrorMsg != null && !TextUtils.isEmpty(mErrorMsg)) { mView.showErrorMsg(mErrorMsg); } else if (e instanceof ServerException) { mView.showErrorMsg(e.toString()); } else if (e instanceof HttpException) { mView.showErrorMsg(WanAndroidApp.getInstance().getString(R.string.http_error)); } else { mView.showErrorMsg(WanAndroidApp.getInstance().getString(R.string.unKnown_error)); LogHelper.d(e.toString()); } if (isShowError) { mView.showError(); } }

tianminggh commented 6 years ago

可以debug看下,是否进入了此方法,再看其中的流程处理~ @override public void onError(Throwable e) { if (mView == null) { return; } if (mErrorMsg != null && !TextUtils.isEmpty(mErrorMsg)) { mView.showErrorMsg(mErrorMsg); } else if (e instanceof ServerException) { mView.showErrorMsg(e.toString()); } else if (e instanceof HttpException) { mView.showErrorMsg(WanAndroidApp.getInstance().getString(R.string.http_error)); } else { mView.showErrorMsg(WanAndroidApp.getInstance().getString(R.string.unKnown_error)); LogHelper.d(e.toString()); } if (isShowError) { mView.showError(); } } debug就是不走这个方法,所以感觉很奇怪

JsonChao commented 6 years ago

我刚刚debug看了下,最终调用到ObservableFlatMap的onError方法,最后执行的代码为parent.disposeAll()而没有执行到RxJavaPlugins.onError(t)。所以并不会调用到BaseObserver的onError()方法,app也并不会崩溃,源码如下: // 最终调用到ObservableFlatMap中 @Override public void onError(Throwable t) { if (parent.errors.addThrowable(t)) { if (!parent.delayErrors) { // 执行到这里 parent.disposeAll(); } done = true; parent.drain(); } else { // 没有执行到这里 RxJavaPlugins.onError(t); } }