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}") } }
- 基础配置缺失检查
- 检查AndroidManifest.xml中是否添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />,无权限的话无法发起网络请求 - 验证
apiKey是否有效:是否是NewsAPI后台申请的正确密钥,是否超出了免费调用额度,是否存在拼写错误 - 检查Retrofit版本是否在2.6.0以上,只有2.6.0及以上版本原生支持
suspend修饰的接口方法
内容的提问来源于stack exchange,提问作者Dibya Ranjan
相关产品推荐
相关产品推荐

