【问题标题】:How to resend request with android volley when not authorized未经授权时如何使用android volley重新发送请求
【发布时间】:2015-06-27 07:44:36
【问题描述】:

在我的 android 应用程序中,我必须使用 android volley 执行一些 http 请求。如果我的请求成功,一切正常,当我收到错误并且此错误具有状态代码 401 时,就会出现问题。在这种情况下,我想做一些东西并重复相同的请求、相同的 url 和相同的参数。有没有官方的方法可以做到这一点?如果没有,我怎样才能从错误中获取我的参数?

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);

任何帮助将不胜感激。

【问题讨论】:

    标签: java android http android-volley


    【解决方案1】:

    您可以创建RetryPolicy 来更改默认重试行为,仅指定超时毫秒数、重试计数参数:

    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();
                }
            }
        }));
    }
    

    希望对你有帮助

    【讨论】:

    • 问题是关于401,不是超时。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-01-08
      • 1970-01-01
      • 2021-07-24
      • 2017-10-15
      • 1970-01-01
      • 2015-12-21
      • 2017-08-25
      • 1970-01-01
      • 2017-11-21
      相关资源
      最近更新 更多