You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rxjava - UndeliverableException问题:Android后端请求偶发失败抛异常

问题分析与解决方案

嘿,咱们先把问题的根源理清楚:你遇到的io.reactivex.exceptions.UndeliverableException其实是个「包装异常」,它真正的元凶是android.os.NetworkOnMainThreadException——你的GetService()方法里,Observable.fromCallable()默认会在当前线程(也就是MainActivity的主线程)执行call()方法里的网络请求,而Android明确禁止在主线程发起网络操作,所以就触发了这个异常。至于「有时正常有时失败」,大概率是偶然情况下你的代码被其他全局线程配置影响了,但核心问题还是没有明确给网络请求分配后台线程。

下面是具体的修复方案:

1. 给请求分配正确的线程

用RxJava的subscribeOn()和observeOn()操作符,明确指定网络请求在后台线程执行,结果回调回到主线程(方便后续更新UI)。修改你的调用代码如下:

GetService()
    .subscribeOn(Schedulers.io()) // 让网络请求在IO后台线程执行
    .observeOn(AndroidSchedulers.mainThread()) // 把结果回调切回主线程
    .subscribe(new Observer<Response>() {
        @Override
        public void onSubscribe(Disposable d) {
            // 建议在这里保存Disposable,后续可以用来取消请求(比如页面销毁时)
        }

        @Override
        public void onNext(Response response) {
            // 处理正常返回的响应数据
        }

        @Override
        public void onError(Throwable e) {
            // 处理请求异常,比如给用户弹个网络错误提示
        }

        @Override
        public void onComplete() {
            // 请求完成后的收尾操作,比如关闭加载弹窗
        }
    });

2. 额外的异常防护(可选)

如果之后还是偶尔遇到UndeliverableException,可以全局设置RxJava的异常处理器,避免因未捕获的异常导致崩溃:

// 建议在Application的onCreate()里初始化
RxJavaPlugins.setErrorHandler(throwable -> {
    if (throwable instanceof UndeliverableException) {
        throwable = throwable.getCause();
    }
    // 这里可以记录异常日志,或者忽略一些非致命的异常
});

补充说明

subscribeOn(Schedulers.io())是告诉RxJava用IO线程池来执行上游的网络请求逻辑,而observeOn(AndroidSchedulers.mainThread())则把下游的回调操作切换回主线程,这样既遵守了Android的网络规则,也能安全地在回调里更新UI。

内容的提问来源于stack exchange,提问作者JenuRudan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:16:50