使用Retrofit+RxJava框架时,OnError报错

  • Post author:
  • Post category:java


使用Retrofit+RxJava3进行网络请求,如果在订阅时,只处理了onNext的回调,没有处理onError的回调时,如下图,会抛出异常,造成app崩溃。

getService(CommonApi.class).checkUpdate()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(result->{
                
				});

这是因为,当我们调用上述方法订阅时,RxJava3在方法内部添加了Functions.ON_ERROR_MISSING回调,对error进行了处理,默认会抛出异常。

public final Disposable subscribe(@NonNull Consumer<? super T> onNext) {
        return subscribe(onNext, Functions.ON_ERROR_MISSING, Functions.EMPTY_ACTION);
}
public static final Consumer<Throwable> ON_ERROR_MISSING = new OnErrorMissingConsumer();

static final class OnErrorMissingConsumer implements Consumer<Throwable> {
    @Override
    public void accept(Throwable error) {
        RxJavaPlugins.onError(new OnErrorNotImplementedException(error));
    }
}
public final class OnErrorNotImplementedException extends RuntimeException {
    public OnErrorNotImplementedException(@NonNull Throwable e) {
        this("The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | " + e, e);
    }
}

但是我们不想每次订阅都去处理error怎么办呢?这个默认的处理可不可以修改呢?


当然可以!

RxJavaPlugins提供了设置error处理的方法

public final class RxJavaPlugins {
	public static void setErrorHandler(@Nullable Consumer<? super Throwable> handler) {
	    if (lockdown) {
	        throw new IllegalStateException("Plugins can't be changed anymore");
	    }
	    errorHandler = handler;
	}
}

调用以上方法,就可以省去每次订阅时error的处理,且不会报错,错误会转到自己定义的回调中。



版权声明:本文为qq_23049111原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。