You need to enable JavaScript to run this app. 安卓新闻应用接入NewsAPI.org API编译通过但无法拉取新闻数据求助
优惠活动
大模型
产品
解决方案
定价
更多

安卓新闻应用接入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 02:45:04