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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:49:43