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

Kotlin Retrofit调用NewsAPI接口未得到响应的问题求助

问题排查及解决方案

  • API端点参数不匹配
    NewsAPI 中country是v2/top-headlines接口专属的过滤参数,你当前调用的v2/everything接口不支持该参数,请求会直接返回错误,无法进入isSuccessful分支。
    解决方法:要么把@GET的路径改为v2/top-headlines,要么去掉country查询参数改用q等everything接口支持的过滤参数。

  • 数据类非空声明导致解析失败
    NewsAPI返回的字段存在大量可能为空的场景:比如Source的id、Article的author、urlToImage等字段都可能返回null,你当前所有字段都声明为非空类型,只要有一个字段为空,Gson解析就会直接失败,不会返回成功结果。
    解决方法:把可能为空的字段改为可空类型,示例:

data class Source(
    val id: String?, // 改成可空
    val name: String
)
// Article中对应字段也同步修改为可空:author、content、description、urlToImage等
  • IO线程操作UI导致崩溃
    你在Dispatchers.IO的协程上下文中调用Toast.makeText执行UI操作,Android要求所有UI操作必须在主线程执行,此处会直接抛出异常,哪怕请求成功也不会执行后续逻辑,且未捕获异常的话会直接静默崩溃。
    解决方法:切换到主线程执行UI操作,示例:
GlobalScope.launch(Dispatchers.IO) {
    // 新增异常捕获
    try {
        val result = newsservice.getNews(country,page, apiKey)
        if(result.isSuccessful){
            // 切换到主线程操作UI
            withContext(Dispatchers.Main) {
                Toast.makeText(this@MainActivity,"HEllo World",Toast.LENGTH_LONG).show()
            }
            val list = result.body()!!.articles
            list.forEach {
                Log.d("debug", it.source.id ?: "null id")
            }
        } else {
            // 新增失败日志打印,方便排查错误
            Log.e("debug", "请求失败:${result.errorBody()?.string()}")
        }
    } catch (e: Exception) {
        Log.e("debug", "请求异常:${e.message}")
    }
}
  • 基础配置缺失检查
  1. 检查AndroidManifest.xml中是否添加了网络权限:<uses-permission android:name="android.permission.INTERNET" />,无权限的话无法发起网络请求
  2. 验证apiKey是否有效:是否是NewsAPI后台申请的正确密钥,是否超出了免费调用额度,是否存在拼写错误
  3. 检查Retrofit版本是否在2.6.0以上,只有2.6.0及以上版本原生支持suspend修饰的接口方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:15:05