Android Volley二次跳转后getParams()未调用,参数重复问题
问题分析与解决方案
这是典型的Volley请求缓存机制导致的问题,我来帮你拆解原因并给出解决办法:
问题原因
Volley默认会对所有请求(包括POST请求)进行缓存处理。当你第二次发起相同URL、相同请求方法的请求时,Volley会检查是否有已缓存的响应,如果缓存还没失效,就直接返回缓存的结果,不会重新调用getParams()方法,也不会向服务器发送新的请求。从你的日志就能看出来——第二次请求完全没输出paramis相关日志,直接返回了第一次的错误提示,说明走的是缓存。
解决方案
有两种常用的解决方式,你可以根据需求选择:
方式一:直接禁用该请求的缓存(最简单)
在创建StringRequest之后,调用setShouldCache(false)方法,告诉Volley不要缓存这个请求的响应,这样每次发起请求都会重新执行getParams()并发送新参数:
private void checkLogin(final String email, final String password ,final String fbid) { String tag_string_req = "req_login"; pDialog.setMessage("Iniciando Sesión ..."); showDialog(); StringRequest strReq = new StringRequest(Request.Method.POST, AppConfig.URL_UPDATEFB, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d(TAG, "UPDATE Response: " + response.toString()); hideDialog(); // 原有的响应处理逻辑不变 try { JSONObject jObj = new JSONObject(response); boolean error = jObj.getBoolean("error"); // ... 剩下的代码 } catch (JSONException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, "Login Error: " + error.getMessage()); Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); hideDialog(); } }) { @Override protected Map<String, String> getParams() { Log.e(TAG, "datos enviados: " + email + password); Map<String, String> params = new HashMap<String, String>(); params.put("email", email); params.put("password", password); params.put("fbid", fbid); Log.e(TAG, "paramis:" + params); return params; } }; // 关键:禁用缓存,确保每次请求都重新获取参数并发送 strReq.setShouldCache(false); AppController.getInstance().addToRequestQueue(strReq, tag_string_req); }
方式二:自定义缓存Key(适合需要缓存不同参数请求的场景)
如果你希望对不同参数的请求分别缓存,可以重写getCacheKey()方法,把请求参数拼接到缓存Key中,这样不同参数的请求会生成不同的缓存Key,不会互相覆盖:
// 在StringRequest的匿名内部类中添加这个方法 @Override public String getCacheKey() { // 将参数作为缓存Key的一部分,确保参数不同时缓存Key唯一 return super.getCacheKey() + ":" + email + ":" + password + ":" + fbid; }
验证效果
修改后再测试第二次请求,你会发现日志里重新输出了paramis的内容,并且服务器收到的是新的参数,不会再重复第一次的请求数据了。
内容的提问来源于stack exchange,提问作者jacolo
相关产品推荐
相关产品推荐

