Android - Volley JSON 对远程服务器的请求只能正常工作一次

Android - Volley JSON request to remote server only works correctly once

我正在开发一个 Android 应用程序,我需要从远程服务器的 MySQL 数据库中获取结果。我写了一些 PHP 脚本来查询数据库并以 JSON 格式输出结果。

问题是请求仅在第一次获取预期结果。当我用不同的 POST 参数发送相同的请求时,它再次 returns 第一个结果。我修改了 PHP 脚本以在 JSON 结果中附加 POST 参数并尝试记录 POST 参数。它也是相同的第一个参数。 如果我从设备上卸载该应用程序并重新安装,它再次 returns 正确 JSON 只有第一次。

注意:当我 运行 相同的代码和相同的 PHP 脚本以及本地主机 (WAMPP) 上的相同数据库时,一切正常。 我尝试使用 Google Chrome 扩展名 Postman 检查远程服务器的输出,它按预期工作。所以,我可以确认问题出在我的 app/code.

这是我的自定义JSONObjectRequest class :

public class CustomJSONObjectRequest extends Request<JSONObject> {

private Listener<JSONObject> listener;
private Map<String, String> params;

public CustomJSONObjectRequest(String url, Map<String, String> params,
                     Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(Method.GET, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

public CustomJSONObjectRequest(int method, String url, Map<String, String> params,
                     Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(method, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

protected Map<String, String> getParams()
        throws com.android.volley.AuthFailureError {
    return params;
};

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {
        String jsonString = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers));
        return Response.success(new JSONObject(jsonString),
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        return Response.error(new ParseError(je));
    }
}

@Override
protected void deliverResponse(JSONObject response) {
    listener.onResponse(response);
}
}

这就是我发送请求的方式:

            String item_name = getIntent().getExtras().getString("item_name");
            String url = getString(R.string.remote_server)+"fetch-item-list.php";

            CustomJSONObjectRequest jsObjRequest = new CustomJSONObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {


                    try {
                        Log.d("item name from intent extra", item_name); //intent extra
                        Log.d("response", response.toString()); //json response
                        Log.d("item name from response", response.getString("item_name")); //post parameter. This and the intent extra should be same

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
                }
            }) {
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    Map<String, String> params = new HashMap<>();

                    params.put("item_name", item_name);

                    return params;
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> header = new HashMap<String, String>();
                    header.put("Content-Type", "application/json; charset=utf-8");
                    return header;
                }
            };



            MyVolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(jsObjRequest);

这是 logcat :

D/item name from intent extra: apple
D/Response: {"data":[{"item_discount":"0.00","item_price":"50.00","unique_id":"181................
D/item name from response: orange

我想我找到了解决办法

看起来 JSON 响应被缓存了,所以第一个请求的响应被缓存了,下一个请求永远不会发送到服务器。每隔一个请求返回缓存的 JSON 响应。

我所要做的就是禁用缓存。 我在将它添加到请求队列之前添加了行 jsObjRequest.setShouldCache(false);

jsObjRequest.setShouldCache(false);
MyVolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(jsObjRequest);

多亏了这个

但我仍然不明白为什么它在没有此设置的情况下在 localhost 上工作。