【问题标题】:Volley Request Callback passing the wrong callback responseVolley Request Callback 传递错误的回调响应
【发布时间】:2015-10-05 11:22:07
【问题描述】:

我在 volley 请求中添加了一个回调,并且我有两个请求从 2 个不同的活动开始。当我执行第一个请求时,第二个返回第一个的响应..

这是我的请求和回调:

public static void RequestJsonToServer(Context ctx, final JSONObject params, final VolleyCallback callback){

    MySingleVolley.getInstance(ctx).
            getRequestQueue();

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,ctx.getString(R.string.defaultServerRequestUrl),params,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    callback.onSuccess(response);
                }
            },new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("REQUEST_JSON_TO_SERVER", "Error: " + error);
                }
            }){
                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        HashMap<String, String> headers = new HashMap<>();
                        headers.put("Content-Type", "application/json");
                        return headers;
                    }
            };

    MySingleVolley.getInstance(ctx).addToRequestQueue(jsObjRequest);

}

public interface VolleyCallback{
    void onSuccess(JSONObject string);
}

这是两个启动请求之一:

Global.RequestJsonToServer(getActivity(), jsonObject, new Global.VolleyCallback() {
        @Override
        public void onSuccess(JSONObject result) {
            Toast.makeText(getActivity(),result.toString(), Toast.LENGTH_LONG).show();
        }
    });

希望有人能帮助我

谢谢

编辑: 我是这样改的

Global.RequestJsonToServer(getApplicationContext(), jsonObject, new Global.VolleyCallback() {

        @Override
        public void onSuccess(JSONObject result) {
            Toast.makeText(getApplicationContext(), result.toString(), Toast.LENGTH_LONG).show();
        }

        @Override
        public void onSuccessCustom(JSONObject string) {

        }
    }, true);

另一个是假的..但可能是错误的使用方式..我希望有一个回调并重用它,而不是在两个回调之间切换

我的解决方案

我找到了自己的解决方案,问题不在回调中,而是在凌空请求中。每个请求的响应都被缓存了,我不知道为什么,总是会返回错误的响应。

我刚刚在向队列添加请求之前添加了这个:

jsObjRequest.setShouldCache(false);

【问题讨论】:

  • 请看我的 2 个回答 herehere
  • 好的,我明白了,但是和我在这里发布答案之前的一样,我总是回复后面的请求!

标签: android json callback request android-volley


【解决方案1】:

发生这种情况是因为您的回调方法很常见[onSuccess(...)]为什么不编写 2 个回调并根据条件使用所需的回调。 要实现它,请在您的界面中编写 2 个方法并传递某种标志来选择回调。
把你的界面改成这个。

public interface VolleyCallback{
    void onSuccess(JSONObject string);
    void customOnSuccess(JSONObject string);
}

还有你的方法

public static void RequestJsonToServer(boolean flag,Context ctx, final JSONObject params, final VolleyCallback callback){

    MySingleVolley.getInstance(ctx).
            getRequestQueue();

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,ctx.getString(R.string.defaultServerRequestUrl),params,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    if(flag){
                    callback.onSuccess(response);
                    }else{
                    callback.CustomOnSuccess(response);
                   }
                }
            },new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("REQUEST_JSON_TO_SERVER", "Error: " + error);
                }
            }){
                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        HashMap<String, String> headers = new HashMap<>();
                        headers.put("Content-Type", "application/json");
                        return headers;
                    }
            };

    MySingleVolley.getInstance(ctx).addToRequestQueue(jsObjRequest);

}

是的,它可重复使用 onSucces,只要你只有一个回调,当你有多个回调时都使用。

【讨论】:

  • 非常感谢,我正在寻找那个.. 你能给我举个例子吗???谢谢
  • 但是我要做很多请求,我想做一个可重用的回调,而不是每个请求一个..
  • 非常感谢您的帮助!
  • 而用法是当我必须使用一个回调时,我会传递 true,而不是另一个回调,我会传递 false?
  • 代码正确但无法正常工作,因为您正在创建请求对象的新实例。每个应用程序应该只有一个请求对象。请相应地修改您的代码[实现单点模式]然后它将开始工作我在测试后发布了代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
相关资源
最近更新 更多