Android调用NewsData.io API固定时间返重复数据,能否每次刷新获新数据?
解决NewsData.io API重复返回相同数据的问题
问题根源
- Volley本地缓存:Volley默认会缓存GET请求的响应,短时间内用同一个URL发起请求时,会直接读取本地缓存,不会真正去调用API获取新数据。
- 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
相关产品推荐
相关产品推荐

