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

使用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的处理,且不会报错,错误会转到自己定义的回调中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值