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

Android调用NewsData.io API固定时间返重复数据,能否每次刷新获新数据?

解决NewsData.io API重复返回相同数据的问题

问题根源

  1. Volley本地缓存:Volley默认会缓存GET请求的响应,短时间内用同一个URL发起请求时,会直接读取本地缓存,不会真正去调用API获取新数据。
  2. API默认分页限制:NewsData.io API默认只返回第一页的新闻内容,若每次请求参数完全一致,自然会拿到同一组数据;同时免费版API自带服务器端缓存,固定周期内相同参数的请求会返回缓存结果。

解决方法

1. 禁用Volley本地缓存

在创建JsonObjectRequest后,添加禁用缓存的配置,强制每次请求都从服务器拉取最新数据:

val jsonObjectRequest = JsonObjectRequest(Request.Method.GET, url, null,
    { /* 成功回调逻辑 */ },
    { /* 错误回调逻辑 */ }
).apply {
    setShouldCache(false) // 禁用本地缓存
}

2. 使用API分页参数获取不同数据

NewsData.io支持page分页参数,每次刷新时递增页码,即可获取下一页的新闻内容。还可以搭配limit参数调整每页返回的新闻数量(默认10条)。

修改你的fetchData方法,新增page参数:

companion object {
    private const val baseUrl =
        "https://newsdata.io/api/1/news?apikey=API_KEY&language=en&country=in&category="

    // 新增page参数,默认传1
    fun fetchData(category: String, page: Int = 1, context: Context, listener: NewsFetchListener) {
        val newsList = ArrayList<News>()
        Log.d("Networking", "start")
        // 拼接分页参数,这里设置每页20条,可根据需求调整
        val url = "$baseUrl$category&page=$page&limit=20"
        val jsonObjectRequest = JsonObjectRequest(Request.Method.GET, url, null,
            {
                val results = it.getJSONArray("results")
                for (i in 0 until results.length()) {
                    val article = results.getJSONObject(i)
                    val news = News(
                        article.getString("title"),
                        article.getString("description"),
                        article.getString("image_url"),
                        article.getString("pubDate"),
                        article.getString("source_id"),
                        article.getString("link")
                    )
                    newsList.add(news)
                }
                listener.onNewsFetched(newsList)
            },{
                val statusCode = it.networkResponse?.statusCode
                Log.e("MainActivity", "Error - status code: $statusCode")
                listener.onError()
            }
        ).apply {
            setShouldCache(false) // 禁用本地缓存
        }
        MySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest)
        // 移除无用的return newsList:Volley是异步请求,返回时列表还未填充数据
    }
}

在调用fetchData的地方,维护一个页码变量,每次刷新时递增:

private var currentPage = 1

// 刷新按钮点击逻辑
fun onRefreshClicked() {
    Networking.fetchData("your_target_category", currentPage, this, object : Networking.NewsFetchListener {
        override fun onNewsFetched(newsList: ArrayList<News>) {
            // 更新列表UI
            currentPage++ // 下次刷新获取下一页内容
        }

        override fun onError() {
            // 处理请求失败场景
        }
    })
}

3. 可选:拉取最新新闻内容

如果不想用分页,希望每次刷新都获取最新发布的新闻,可以添加from_date参数,设置为当前时间往前推一段时长(比如10分钟),确保每次请求都拉取近期的新内容:

// 生成符合API要求的日期格式(YYYY-MM-DD HH:MM:SS)
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)
val tenMinutesAgo = Date(System.currentTimeMillis() - 10 * 60 * 1000)
val fromDate = dateFormat.format(tenMinutesAgo)

// 拼接至请求URL
val url = "$baseUrl$category&from_date=$fromDate"

注意:from_date参数的可用范围可能受API套餐限制,免费版的时间范围有约束,具体以NewsData.io官方说明为准。

补充提醒

  • 使用分页时,当页码超过API支持的最大页数,会返回空数据或重复内容,此时将currentPage重置为1即可实现循环分页。
  • NewsData.io的服务器端缓存机制在免费版中无法调整,因此分页或时间参数是解决重复数据问题的最可靠方式。

内容的提问来源于stack exchange,提问作者Karan Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:53:24