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
相关产品推荐
相关产品推荐

