如何在未经授权的情况下使用android volley重新发送请求

时间:2015-06-27 07:44:37

标签: java android http android-volley

在我的Android应用程序中,我必须使用android volley做一些http请求。如果我的请求成功,那么当我收到错误并且此错误包含状态代码401 时会出现问题。在这种情况下,我想做一些东西,并重复相同的请求,相同的网址和相同的参数。有官方的方法吗?如果没有,我怎样才能从错误中获取我的参数?

StringRequest req = new StringRequest(method, URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response){
                    //VolleyLog.v("Response:%n %s", response);
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            NetworkResponse response = error.networkResponse;
            if(response.statusCode == 401){
                //make some stuff...
                //here i want to resend my request
            }
        }
    }) {

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            //get headers
        }

        @Override
        public Map<String, String> getParams() throws AuthFailureError {
            //get params
        }


    };

    // add the request object to the queue to be executed
    ApplicationController.getInstance().addToRequestQueue(req);

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以创建RetryPolicy来更改默认重试行为,只指定timeout milliseconds,重试计数参数:

public class YourRequest extends StringRequest {
    public YourRequest(String url, Response.Listener<String> listener,
                       Response.ErrorListener errorListener) {
        super(url, listener, errorListener);
        setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    }
}

另一种方法是估计VolleyError,如果是TimeoutError实例,则再次重新执行相同的请求:

public static void executeRequest() {
    RequestQueue.add(new YourRequest("http://your.url.com/", new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            if (error instanceof TimeoutError) {
                // note : may cause recursive invoke if always timeout.
                executeRequest();
            }
        }
    }));
}

希望这会对你有所帮助

答案 1 :(得分:-1)

修改请求后,在requestQueue中添加请求。 在ErrorListener中执行此操作。