Android使用Retrofit2请求接口数据无显示且无报错问题排查
问题排查与解决方法
1. 修复代码中的复制粘贴错误
你在onResponse方法里犯了明显的复制失误:所有TextView的赋值都复用了apiResponse?.local字段,并未对应使用utc、message、code字段,这会导致所有控件要么显示重复的local数据,要么显示空内容。修改后的代码如下:
override fun onResponse(call: Call<ApiResponse>, response: Response<ApiResponse>) { if (response.isSuccessful) { val apiResponse: ApiResponse? = response.body() local.text = getString(R.string.local_placeholder, apiResponse?.local.orEmpty()) utc.text = getString(R.string.utc_placeholder, apiResponse?.utc.orEmpty()) message.text = getString(R.string.message_placeholder, apiResponse?.message.orEmpty()) code.text = getString(R.string.code_placeholder, apiResponse?.code.orEmpty()) } else { // 新增:打印非成功响应状态码,排查接口问题 Log.e("MainActivity", "请求失败,状态码:${response.code()}") } }
2. 处理Android 9+的明文HTTP限制
你的接口使用http协议,而Android 9(API 28)及以上系统默认禁止明文网络请求,这会导致请求被静默拦截,无明显报错。解决方法:
- 在
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>标签中添加配置:
<application ... android:networkSecurityConfig="@xml/network_security_config">
3. 增加日志调试,明确请求状态
在onResponse和onFailure中添加日志,确认请求的实际状态:
override fun onResponse(call: Call<ApiResponse>, response: Response<ApiResponse>) { Log.d("MainActivity", "响应状态码:${response.code()}") Log.d("MainActivity", "响应体内容:${response.body()}") if (response.isSuccessful) { // 赋值逻辑... } else { Log.e("MainActivity", "错误响应内容:${response.errorBody()?.string()}") } } override fun onFailure(call: Call<ApiResponse>, t: Throwable) { Log.e("MainActivity", "请求失败原因", t) }
通过日志可以确认:
- 请求是否真的成功(状态码是否为2xx)
- 响应体是否为空或字段不匹配
- 请求失败的具体原因(如网络连接、解析错误)
4. 验证接口返回格式与数据类匹配
确保接口返回的JSON字段名和ApiResponse类的属性完全一致(大小写敏感)。如果字段名不匹配(比如接口返回Code而非code),Gson会无法解析,导致response.body()为null。可通过@SerializedName注解适配字段名:
data class ApiResponse( @SerializedName("local") val local: String?, @SerializedName("utc") val utc: String?, @SerializedName("message") val message: String?, @SerializedName("code") val code: String? )
5. 检查模拟器网络连接
确认Android模拟器可正常访问外部网络:
- 在模拟器浏览器中打开
http://ries.world:32170/rest/getDateTime,查看是否能返回正常JSON数据 - 若无法访问,检查模拟器网络设置,或切换到真机测试
内容的提问来源于stack exchange,提问作者Diddy
相关产品推荐
相关产品推荐

