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

Android中Retrofit+RxJava网络请求doOnSubscribe方法未调用问题

解决思路

1. 修正doOnSubscribe的执行线程(核心问题)

startProgressDialog是UI操作,必须在主线程执行。你的代码中subscribeOn(Schedulers.io())会将doOnSubscribe的执行线程切换到IO线程,导致UI操作无法正常触发(表现为加载框不显示,看起来像方法未调用)。

推荐两种调整方式:

  • 方式一:在doOnSubscribe中强制切换到主线程执行UI操作
m_VerifyVersionCommObj = m_MultiplayerRound.testServerVersion()
        .subscribeOn(Schedulers.io())
        .doOnSubscribe {
            // 强制在主线程执行加载框显示逻辑
            AndroidSchedulers.mainThread().scheduleDirect { startProgressDialog() }
        }
        .delay(1500, TimeUnit.MILLISECONDS) // TODO: 建议先移除测试
        .observeOn(AndroidSchedulers.mainThread())
        .doOnTerminate { stopProgressDialog() }
        .doOnComplete { stopProgressDialog() }
        .subscribe({ data -> checkServerVersion(data.body()) },
            { error -> error.localizedMessage?.let { showError(it) } })
  • 方式二:调整操作符顺序,让doOnSubscribe在主线程触发
    将doOnSubscribe移到observeOn之后(注:此方式依赖下游线程,不如方式一严谨):
m_VerifyVersionCommObj = m_MultiplayerRound.testServerVersion()
        .subscribeOn(Schedulers.io())
        .delay(1500, TimeUnit.MILLISECONDS)
        .observeOn(AndroidSchedulers.mainThread())
        .doOnSubscribe { startProgressDialog() }
        .doOnTerminate { stopProgressDialog() }
        .doOnComplete { stopProgressDialog() }
        .subscribe({ data -> checkServerVersion(data.body()) },
            { error -> error.localizedMessage?.let { showError(it) } })

2. 检查startProgressDialog方法的实现

确认方法内部没有以下问题:

  • 使用了Application Context创建Dialog(必须用当前Activity的Context)
  • 存在线程判断逻辑阻止UI操作
  • Dialog的样式、显示逻辑有错误(比如设置了cancelable=false但未正确绑定生命周期)

3. 验证doOnSubscribe是否真的未执行

在doOnSubscribe中添加日志输出,确认方法是否被触发:

.doOnSubscribe {
    Log.d("VersionCheck", "doOnSubscribe triggered")
    startProgressDialog()
}

如果日志有输出,说明是加载框显示的问题;如果无输出,排查:

  • testServerVersion()返回的Observable是否被提前dispose
  • 调用这段请求代码的时机是否合法(比如是否在Activity生命周期的有效阶段)

4. 移除delay代码测试

当前的delay(1500)是测试代码,可能导致加载框显示后立即被隐藏(被doOnTerminate/doOnComplete的stopProgressDialog覆盖),先移除该代码验证效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:20:38