如何在前台服务中结合RxJava3与Retrofit实现异步请求并展示通知
问题排查点
- 接口请求参数错误
你当前调用getDayNewsRxJava时传入的两个参数都是硬编码的固定字符串"language"和"apiKey",完全不符合接口要求:- 接口定义的第一个Query参数是
country,需要传入合法的国家/地区码,比如"us"、"cn",不是字符串"language" - 第二个参数需要传入你在newsapi平台申请的真实有效ApiKey,不是字符串
"apiKey"
错误的参数会直接导致接口返回400/401类错误,走onError回调。
- 接口定义的第一个Query参数是
- 多余的
@Streaming注解@Streaming是用于大文件下载场景的注解,普通JSON接口不需要添加。加了该注解后Gson解析响应时会按流处理,无法正常解析完整JSON结构,会触发解析异常。 - 先确认回调执行情况
先查看Logcat的输出:- 如果有
Rx Java Error日志:打印e?.printStackTrace()查看完整异常堆栈,就能直接定位具体错误原因(是网络不通、权限缺失、解析失败还是参数错误) - 如果有
Rx Java Data日志但没收到通知:说明请求已经成功,问题出在通知发送逻辑,Android 8.0及以上系统必须先创建合法的通知渠道,才能正常展示通知
- 如果有
- 权限检查
- 清单文件必须添加
android.permission.INTERNET权限,否则无法发起网络请求 - 如果你使用的是Android 12及以上系统,前台服务需要根据用途申请对应的前台服务权限,比如
android.permission.FOREGROUND_SERVICE_DATA_SYNC - 国内网络环境无法直接访问newsapi.org,需要确认网络连通性
- 清单文件必须添加
- 依赖和配置检查
- 确认RxJava3相关依赖导入完整,且
RxJava3CallAdapterFactory的依赖版本和Retrofit版本匹配,没有错用RxJava2的CallAdapter - 检查混淆规则,确保
Model1相关类没有被混淆,否则Gson会解析失败 - 可以持有请求返回的
Disposable对象,避免订阅被GC提前回收导致请求中断
- 确认RxJava3相关依赖导入完整,且
内容的提问来源于stack exchange,提问作者Mert Krgl
相关产品推荐
相关产品推荐

