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
相关产品推荐
相关产品推荐

