安卓新闻应用接入NewsAPI.org API编译通过但无法拉取新闻数据求助
新闻应用无法拉取NewsAPI数据的问题定位
以下是从提供的代码中排查到的、直接导致数据获取失败的问题,按影响优先级排序:
1. 明文HTTP请求被系统默认拦截
- 你在
MainActivity中定义的基础请求地址使用http协议:http://newsapi.org/v2/top-headlines?country=in&apiKey=7615387a23b04e68b9f2b79719d19786 - Android 9(API 28)及以上系统默认禁止应用发起未加密的明文HTTP请求,所有基于http的请求会被系统网络层直接阻断,无法送达NewsAPI服务器。
- 修复方案:将请求地址的协议头替换为
https,NewsAPI原生支持HTTPS加密请求,替换后无需额外配置网络安全规则即可正常发起请求。
2. 冗余拼接无效的请求参数
- 在
MainActivity的onCreateLoader方法中,在已有的请求地址上额外拼接了两个不属于NewsAPI接口的参数:uriBuilder.appendQueryParameter("format", "geojson"); uriBuilder.appendQueryParameter("limit", "10"); - 这两行是参考USGS地震查询Demo的遗留代码,NewsAPI接口不识别这类参数,会造成请求参数畸形,导致返回非预期响应。
- 修复方案:直接删除上述两行参数拼接代码,原始基础地址已包含必要的
country和apiKey参数,无需额外追加。
3. JSON解析逻辑错误,导致数据解析崩溃
- NewsAPI返回的
publishedAt字段为ISO 8601格式的时间字符串,例如2024-05-20T12:34:56Z,并非可直接转换为毫秒值的纯数字字符串。 - 你在
QueryUtils.extractFeatureFromJson方法中直接对该字符串执行数字转换:
这行代码会直接抛出String time = currentEarthquake.getString("publishedAt"); long ans = parseLong(time);NumberFormatException,触发JSON解析的异常捕获逻辑,最终返回空新闻列表,界面自然无法展示内容。 - 修复方案:替换ISO格式时间的解析逻辑,将字符串正确转换为Date对象后再做时间格式化,禁止直接对非数字格式的时间字符串执行Long类型转换。
4. 基础网络权限遗漏
- 检查项目的
AndroidManifest.xml配置文件,确认是否添加了网络访问权限:- 必须配置
<uses-permission android:name="android.permission.INTERNET" />,否则应用无发起网络请求的基础权限,所有请求都会被系统直接拒绝。
- 必须配置
非功能性冗余说明
- 现有代码中大量变量名、日志内容、组件命名均为地震Demo的遗留(如变量名
earthquakeArray、currentEarthquake,Loader ID命名为EARTHQUAKE_LOADER_ID),这类命名问题不影响编译和核心功能运行,但会提升后续维护的排查成本,可按需调整为匹配新闻业务的语义化命名。
内容的提问来源于stack exchange,提问作者YASH 18cs85
相关产品推荐
相关产品推荐

