Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava2中的onError未实现错误,即使其已实现_Java_Android_Error Handling_Rx Java2_Rx Android - Fatal编程技术网

RxJava2中的onError未实现错误,即使其已实现

RxJava2中的onError未实现错误,即使其已实现,java,android,error-handling,rx-java2,rx-android,Java,Android,Error Handling,Rx Java2,Rx Android,因此,我有一个非常基本的RxJava observer流工作流,其中我从改造中请求一些东西,通过成功的响应我toast successful msg,通过错误我toast error msg 下面我提到的案例是一个错误案例,我希望从API中得到错误消息,我将其转换为用户可读的单词并显示为Toast,如下所示,当我使用doOnNext和doOnError方法时,它会以这种方式崩溃,并出现所提到的错误 我还添加了throweExceptionIffailure方法,该方法显示了如何转换可读消息和控制

因此,我有一个非常基本的RxJava observer流工作流,其中我从改造中请求一些东西,通过成功的响应我toast successful msg,通过错误我toast error msg

下面我提到的案例是一个错误案例,我希望从API中得到错误消息,我将其转换为用户可读的单词并显示为
Toast
,如下所示,当我使用
doOnNext
doOnError
方法时,它会以这种方式崩溃,并出现所提到的错误

我还添加了
throweExceptionIffailure
方法,该方法显示了如何转换可读消息和控制台指向错误的行

registerNFCTag(body)
                .map(result -> throwExceptionIfFailure(result))
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(result -> {
                  toggleLoaders(true);                        
                 appToast(getString(R.string.done_msg) + tagName);
                })
                .doOnError(throwable -> {
                    Toasty.error(this, throwable.getLocalizedMessage()).show();
                    toggleLoaders(true);
                })
                .subscribeOn(Schedulers.io())
                .subscribe();
错误如果这还不够,我也可以发布stacktrace

java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
通过异常失效方法

public <T> T throwExceptionIfFailure(T res) {

    Response result = (Response<?>) res;
    if (!result.isSuccessful()) {
        try {
            String msg = result.errorBody().string();
            Log.d(TAG, "throwExceptionIfFailure: "+msg);
            if (result.code() == 401 || result.code() == 403) {
                invalidateToken();
                msg = context.getString(R.string.invalid_credential);
            }
            else if (result.code() == 502)
                msg = context.getString(R.string.server_down);
            else if (result.code() == 422)
                msg = context.getString(R.string.invalid_domain);
            else if (result.code() == 500)
                msg = context.getString(R.string.internal_server_error_500_msg);
            else if (result.code() == 451)
------><>>>>>> expected error msg works well with the case mentioned below with throwable in subscribe itself.
                msg = context.getString(R.string.toast_tag_already_registered_error);

            if (result.code() == 403)
                throw new TokenException();
            else
------>>>>>below line where console points error                  
                throw Exceptions.propagate(new RuntimeException(msg)); 

        } catch (Throwable e) {
            throw Exceptions.propagate(e);
        }
    } else {
        return res;
    }
}

还是RxJava2领域的新手,所以,请帮助我理解其中的区别。先谢谢你

从RxJava 2.1.9开始,有多种
subscribe()
方法。您使用了一个重载,根本不需要消费者。异常消息告诉您,您应该使用
subscribe()
重载,该重载会导致错误
消费者
,例如


doError()
是一个“副作用”运算符,它与实际订阅无关。

需要在
subscribe()
中作为第二个参数执行错误处理。如果该错误不存在,则会收到一个未处理该错误的通知
doOnError()
实际上并不是一个错误处理程序,尽管它的名字很含蓄。好吧,那么在第一种情况下,我应该如何处理doOnError()中的错误?为什么您不喜欢您在问题末尾发布的工作示例?你的问题具体是什么?很好,我只用那个,但我只是好奇想知道。
registerNFCTag(body)
                .map(result ->throwExceptionIfFailure(result))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(
                        result -> {
                            toggleLoaders(true);
                            appToast(getString(R.string.done_msg) + tagName);
                        }
                        , throwable -> {
                            Toasty.error(this, throwable.getLocalizedMessage()).show();
                            toggleLoaders(true);
                        });