Android使用Volley请求JSON数据仅显示缓存旧数据如何实现实时更新
问题原因
你使用的Volley网络请求框架默认开启了HTTP缓存机制,相同URL的请求会优先读取本地缓存返回,不会主动请求服务器最新数据,所以才会出现只有清空应用缓存才能拿到新内容的情况。
修复方案
方案1:直接关闭当前接口的缓存(最简便,适合实时性要求高的接口)
在jsonrequest()方法中,将请求添加到请求队列之前,添加关闭缓存的配置即可:
// 原有代码 requestQueue = Volley.newRequestQueue(getActivity()); // 新增:关闭当前请求的缓存 request.setShouldCache(false); requestQueue.add(request);
同时要注意,你当前的代码每次请求成功都是往lstAnime里追加数据,会导致多次请求后出现重复数据,需要在解析新数据前清空原有列表:
@Override public void onResponse(JSONArray response) { loading.setVisibility(View.GONE); JSONObject jsonObject = null ; // 新增:清空原有旧数据 lstAnime.clear(); // 原有解析逻辑不变 for (int i = 0 ; i < response.length(); i++ ) { try { jsonObject = response.getJSONObject(i) ; Anime anime = new Anime() ; anime.setName(jsonObject.getString("title")); anime.setDescription(jsonObject.getString("description")); anime.setDate(jsonObject.getString("date")); anime.setCategorie(jsonObject.getString("category")); anime.setAuthor(jsonObject.getString("admin")); anime.setImage_url(jsonObject.getString("thumbnail")); lstAnime.add(anime); } catch (JSONException e) { e.printStackTrace(); } } setuprecyclerview(lstAnime); }
方案2:添加请求头强制获取最新数据(无需完全关闭缓存,兼容性更好)
如果不想完全关闭Volley的缓存能力,可以重写请求的getHeaders()方法,添加缓存控制头,强制要求服务端返回最新内容:
request = new JsonArrayRequest(JSON_URL, new Response.Listener<JSONArray>() { // 原有响应逻辑不变 }, new Response.ErrorListener() { // 原有错误处理逻辑不变 }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); headers.put("Cache-Control", "no-cache"); headers.put("Cache-Control", "no-store"); return headers; } };
可选优化:添加下拉刷新功能
如果需要支持用户手动触发刷新,可以在布局中用SwipeRefreshLayout包裹RecyclerView,设置刷新监听后,在回调中调用jsonrequest()方法即可实现手动刷新数据。
内容的提问来源于stack exchange,提问作者Litu
相关产品推荐
相关产品推荐

