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

遵循Retrofit+Jetpack Compose教程触发OnFailure,求排查及无XML替代方案

问题排查与解答

一、Retrofit现状说明

Retrofit目前仍是Android生态中最主流的网络请求库之一,官方持续维护(最新版本已更新至2.9.x系列),不存在“过时”一说,可放心使用。

二、onFailure回调触发的常见原因

1. 网络权限配置缺失

检查AndroidManifest.xml是否添加必要权限:

<uses-permission android:name="android.permission.INTERNET" />
<!-- 可选,用于提前判断网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

针对Android 9(API28)及以上版本,若请求的是HTTP非HTTPS接口,需在application标签添加:

android:usesCleartextTraffic="true"

2. API接口或URL异常

  • 直接用浏览器/Postman访问目标URL,确认服务器是否正常响应、URL拼写是否正确(注意协议HTTP/HTTPS、域名路径)。
  • 核对请求方法(GET/POST)是否与后端接口要求一致。

3. 数据解析不匹配

你的回调泛型是ArrayList<ListModal>,需确保ListModal类的字段名、数据类型与JSON响应完全对齐(注意大小写、嵌套结构)。比如JSON返回"userName",Modal类里不能写成"username",否则解析失败会触发onFailure。
建议在onFailure中打印具体错误信息定位:

override fun onFailure(call: Call<ArrayList<ListModal>?>, t: Throwable) {
    Toast.makeText(ctx, "Fail to get the data.. ${t.message}", Toast.LENGTH_SHORT).show()
    Log.e("RetrofitError", "详情:${t.stackTraceToString()}")
}

4. Retrofit实例配置错误

检查是否正确添加了转换器(如GsonConverterFactory):

val retrofit = Retrofit.Builder()
    .baseUrl("你的基础URL")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

若使用Kotlin协程,需确保接口方法返回Call或suspend类型,且协程作用域配置正确。

5. 设备网络环境问题

测试设备是否处于正常网络环境,排除代理、VPN、Wi-Fi受限等导致请求无法到达服务器的情况。

三、无XML页面的下拉列表实现方案

Jetpack Compose中直接用DropdownMenu+TextField组合实现,无需XML:

var expanded by remember { mutableStateOf(false) }
var selectedOption by remember { mutableStateOf("") }
// 后续替换为接口返回的真实数据
val options = listOf("选项1", "选项2", "选项3")

Box(modifier = Modifier.fillMaxWidth().padding(16.dp)) {
    TextField(
        value = selectedOption,
        onValueChange = {},
        readOnly = true,
        trailingIcon = {
            Icon(
                imageVector = if (expanded) Icons.Filled.ArrowDropUp else Icons.Filled.ArrowDropDown,
                contentDescription = null,
                modifier = Modifier.clickable { expanded = !expanded }
            )
        },
        modifier = Modifier.fillMaxWidth()
    )
    DropdownMenu(
        expanded = expanded,
        onDismissRequest = { expanded = false },
        modifier = Modifier.fillMaxWidth()
    ) {
        options.forEach { option ->
            DropdownMenuItem(
                onClick = {
                    selectedOption = option
                    expanded = false
                }
            ) {
                Text(text = option)
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者John B Gilbert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:15:09