Retrofit 2 在Android 10(API 29)上无报错不运行,低版本设备可正常运行
问题原因及排查方案
1. 网络安全配置未正确挂载
你已经编写了网络安全配置XML,但需要确认在AndroidManifest.xml的<application>标签中添加了以下属性,否则配置不会生效:
<application ... android:networkSecurityConfig="@xml/network_security_config" ...>
虽然你访问的是HTTPS地址,不需要明文权限,但如果配置未挂载,部分高版本系统的网络校验规则可能拦截请求。
2. OkHttp/Retrofit 版本兼容性问题
低于3.14.x版本的OkHttp对Android 10(API29)的系统网络栈适配存在缺陷,会出现无报错无回调的情况。请检查你的依赖版本,升级到适配Android 10的版本:
// 参考兼容版本 implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
3. 模拟器网络异常
API29模拟器经常出现网络连通性故障,可以按以下步骤排查:
- 打开模拟器自带的浏览器,访问
https://www.flickr.com/确认是否能正常加载 - 检查模拟器是否设置了代理、VPN,或者当前网络对flickr有访问限制
- 部分模拟器默认的DNS解析故障,可以尝试切换模拟器连接的DNS为公共DNS(比如8.8.8.8)
4. Logcat 日志被过滤
API29的Logcat默认过滤规则更严格,可能会屏蔽Debug级别的日志:
- 把日志输出从
Log.d改为Log.e验证是否有输出 - 切换Logcat的过滤模式为「No Filters」,搜索你的TAG关键字确认是否有日志
- 可以给OkHttp添加日志拦截器,直观查看请求的发送和响应情况:
// 先添加日志拦截器依赖 // implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0' val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } val client = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build()
5. 权限配置问题
虽然低版本可以正常请求,但高版本系统如果权限声明位置错误也会导致网络被拦截,请确认INTERNET权限是直接声明在AndroidManifest.xml的<manifest>标签下,而非<application>子标签内:
<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者JProgrammer
相关产品推荐
相关产品推荐

