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

时间:2015-11-10 05:32:53

标签: android mysql json android-volley

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

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

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

这是我的CustomJSONObjectRequest类:

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

1 个答案:

答案 0 :(得分:0)

我认为我找到了解决方案

看起来JSON响应正在缓存,因此第一个请求的响应被缓存,下一个请求从未发送到服务器。每次其他请求都会返回缓存的JSON响应。

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

private double scrollPosition;
public void SaveListPosition()
{
     scrollPosition = scrollViewer.VerticalOffset;
}

public void ScrollToSavedPosition()
{        
     scrollViewer.ChangeView(0, scrollPosition, null, false);
}

感谢question

但是我仍然不明白为什么它没有这个设置就可以在localhost上运行。