Retrofit发起网络请求始终回调onFailure该如何排查解决?
Retrofit请求始终回调onFailure的解决步骤
首先你需要先输出具体的异常信息定位根因,当前onFailure方法仅打印固定提示,无法判断错误类型,先修改代码打印异常栈:
@Override public void onFailure(Call<List<JobItem>> call, Throwable t) { Log.d("ERROR", "ERROR LOADING JSON", t); t.printStackTrace(); }
常见问题及对应解决方法如下:
路径拼接规则异常
Retrofit路径拼接有明确规则,配置不当会导致请求地址错误:
- 建议
baseUrl末尾统一加后缀/,修改单例类中的baseUrl为"http://192.168.1.155:5000/" @GET注解的路径不要以/开头,修改EndPoints接口的注解为@GET("getjobs/hardware")
- 建议
安卓端网络配置缺失
- 检查
AndroidManifest.xml是否已添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - Android 9(API 28)及以上系统默认禁止明文HTTP请求,你的接口为HTTP协议,需要额外配置:
在res/xml目录下新建network_security_config.xml:
然后在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>AndroidManifest.xml的application标签中添加属性:android:networkSecurityConfig="@xml/network_security_config"
- 检查
实体类序列化失败
检查
JobItem实体类是否符合Gson序列化要求:- 字段名和JSON返回的key完全一致,或通过
@SerializedName注解指定映射关系 - 字段类型匹配:如
date为字符串类型,count、packetSize等为数值类型,不要定义错误类型 - 提供public无参构造方法,所有字段添加对应的getter、setter方法
- 字段名和JSON返回的key完全一致,或通过
网络连通性问题
- 确保运行客户端的设备/模拟器和后端服务在同一局域网,用设备浏览器直接访问测试接口地址,确认可以正常拿到返回结果
- 检查后端服务器防火墙是否开放了5000端口,没有拦截客户端请求
内容的提问来源于stack exchange,提问作者Alex Wesley
相关产品推荐
相关产品推荐

