You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:26:01