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

Android应用调用API Layer接口:模拟器正常真机不显示数据求排查

Android 10物理设备API数据返回但界面不显示问题排查方案

核心问题定位

你遇到的情况是模拟器正常、同版本物理机返回200却无数据展示且无报错,大概率是异常未被捕获或数据解析/视图更新逻辑存在隐性问题,结合你的代码,以下是具体排查点和修复方案:

1. 异常捕获范围错误

你的代码中,网络请求retrofit.getCurrencyList().currencies写在try块外部,如果这一步抛出异常(比如Gson解析失败、currencies为null),根本不会被catch捕获,导致后续逻辑直接中断,且无任何提示。

修复代码:
将网络请求及后续数据处理全部纳入try块,并扩大异常捕获范围:

lifecycleScope.launch {
    try {
        // 将网络请求移入try块内
        val currenciesList = retrofit.getCurrencyList()
        val currenciesMap = currenciesList.currencies
        
        // 先判断数据是否为空
        if (currenciesMap.isNullOrEmpty()) {
            Toast.makeText(context, "未获取到有效货币数据", Toast.LENGTH_LONG).show()
            return@launch
        }

        currencies = ArrayList(currenciesMap.keys)
        listAdapter = ArrayAdapter(
            requireContext(),
            android.R.layout.simple_list_item_1,
            currencies
        )
        currencyListView.adapter = listAdapter
        
        // 剩余点击事件、搜索监听逻辑...
        
    } catch (e: Exception) {
        Toast.makeText(context, "加载失败:${e.message}", Toast.LENGTH_LONG).show()
        // 打印完整异常栈,方便排查
        e.printStackTrace()
    }
}

2. Gson解析隐性问题

物理机和模拟器可能存在JSON解析差异(比如API返回字段大小写、额外字段),检查你的CurrencyList模型类是否完全匹配API返回结构:

  • 确保模型类的字段名与API返回的JSON字段完全一致(注意大小写)
  • 为可能为null的字段添加可空标记(比如val currencies: Map<String, String>?)
  • 如果你用了Gson的@SerializedName注解,确认注解值是否正确

示例正确的模型类结构(假设API返回如下JSON):

{
  "success": true,
  "currencies": {
    "USD": "United States Dollar",
    "EUR": "Euro"
  }
}

对应的Kotlin数据类:

data class CurrencyList(
    val success: Boolean,
    val currencies: Map<String, String>? // 标记为可空,避免解析时NPE
)

3. 拦截器潜在干扰

你添加了ConnectivityInterceptor,需检查该拦截器的逻辑:

  • 是否在物理机上错误地修改了请求头或响应体?
  • 是否存在网络判断逻辑错误,导致物理机上请求被异常处理?
  • 临时移除该拦截器,测试物理机是否能正常显示数据,以此排查是否是拦截器的问题

4. 添加日志排查差异

在OkHttpClient中添加日志拦截器,打印完整的请求和响应内容,对比模拟器与物理机的返回差异:

// 添加日志拦截器
val loggingInterceptor = HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BODY // 打印完整请求响应
}

val okHttpClient by lazy {
    OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .addInterceptor(loggingInterceptor) // 先添加日志拦截器
        .addInterceptor(com.kiraosapp.voyagenik.ConnectivityInterceptor())
        .build()
}

通过日志可以直观看到物理机上的响应是否与模拟器一致,是否存在解析失败的情况。

5. 其他排查点

  • 混淆问题:如果开启了代码混淆,确保模型类未被混淆,在proguard-rules.pro中添加:
    -keep class com.yourpackage.models.CurrencyList { *; }
    -keep class com.yourpackage.models.Convert { *; }
    
  • 视图初始化:确认currencyListView在物理机上是否正确绑定(比如布局文件中ID是否一致)
  • 网络权限:虽然返回200,但仍确认AndroidManifest.xml中是否添加了<uses-permission android:name="android.permission.INTERNET"/>

内容的提问来源于stack exchange,提问作者Kira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:57:14