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

Kotlin协程结合Retrofit调用无响应问题求助

问题排查与修复方案

我来帮你梳理下代码里的关键问题,这些问题直接导致你的请求卡住,没有返回结果:

1. Retrofit接口的suspend函数返回类型错误

当你用suspend修饰Retrofit的接口方法时,不需要返回Call<T>类型。Retrofit针对suspend函数做了特殊处理,会自动帮你处理异步逻辑,直接返回Response<T>或者目标实体类就行。如果返回Call,suspend函数不会正确触发请求,会一直挂起在那里,这就是为什么调试器到不了println的原因。

修正后的接口:

interface GitHubService {
    // 用相对路径,配合下面修正的baseUrl
    @GET("users/JakeWharton/repos")
    // 用Response可以拿到状态码、错误信息等,也可以直接返回List<User>
    suspend fun getRepos() : Response<List<User>>
}

2. Retrofit的BaseUrl配置错误

你当前的baseUrl是https://github.com,但接口里写了完整的API地址,这会让Retrofit的URL解析逻辑混乱。正确的做法是把baseUrl设为API的根路径,然后接口里用相对路径:

@Provides
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
    return Retrofit.Builder()
        // 改为API的根路径,末尾必须加斜杠
        .baseUrl("https://api.github.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .client(okHttpClient)
        .build()
}

3. 缺少异常处理逻辑

你的loadData函数没有捕获任何异常,如果请求过程中出现网络问题、数据解析错误等,协程会抛出异常但没被处理,也会导致代码无法继续执行。建议加上异常捕获:

private suspend fun loadData() {
    try {
        val response = service.getRepos()
        if (response.isSuccessful) {
            // 请求成功,拿到返回数据
            println("仓库列表:${response.body()}")
        } else {
            // 请求失败,打印状态码和错误信息
            println("请求失败,状态码:${response.code()},错误信息:${response.errorBody()?.string()}")
        }
    } catch (e: Exception) {
        // 捕获网络、解析等异常
        println("请求出错:${e.message}")
        e.printStackTrace()
    }
}

把这些修改完成后,再运行代码应该就能正常获取到GitHub仓库列表了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:52:44