【问题标题】:Volley RequestQueue Timeout排球请求队列超时
【发布时间】:2014-02-12 04:02:15
【问题描述】:
RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext());
mRequestQueue.add(new JsonObjectRequest(Method.GET, cityListUrl, null, new Listener<JSONObject>() 
{
    public void onResponse(JSONObject jsonResults) 
    {
        //Any Call
    }
}, new ErrorListener()
   {
        public void onErrorResponse(VolleyError arg0) 
        {
            //Any Error log
        }
   }
));

这是我的请求呼叫,我想更改或设置请求的超时。到底有没有可能??

【问题讨论】:

    标签: java android android-volley connection-timeout


    【解决方案1】:

    你应该设置请求的RetryPolicy:

    myRequest.setRetryPolicy(new DefaultRetryPolicy(
                    MY_SOCKET_TIMEOUT_MS, 
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    

    这会将您的代码更改为:

    RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext());
    JsonObjectRequest request = new JsonObjectRequest(Method.GET, cityListUrl, null, new
        Listener<JSONObject>() {
            public void onResponse(JSONObject jsonResults) {
                //Any Call
            }
        }, new ErrorListener(){
            public void onErrorResponse(VolleyError arg0) {
                //Any Error log
            }
        }
    );
    
    
    int socketTimeout = 30000;//30 seconds - change to what you want
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    request.setRetryPolicy(policy);
    mRequestQueue.add(request);
    

    如果您刚刚开始使用Volley,您可能需要考虑droidQuery,它更容易配置:

    int socketTimeout = 30000;
    $.ajax(new AjaxOptions().url(cityListUrl)
                            .timeout(socketTimeout)
                            .success(new Function() {
                                public void invoke($ d, Object... args) {
                                    JSONObject jsonResults = (JSONObject) args[0];
                                    //Any call
                                }
                            })
                            .error(new Function() {
                                public void invoke($ d, Object... args) {
                                    AjaxError error = (AjaxError) args[0];
                                    Log.e("Ajax", error.toString());
                                }
                            }));
    

    【讨论】:

    • 有没有onTimeOut方法?
    • @Mr.Hyde 我不知道 Volley 中有一个,但您可以使用 statusCode() 在 droidQuery 中处理此问题 接受可以返回的状态代码数组和一个 Function,因此您可以传入超时代码 (480,419,504,503,522,598,599) 和一个将处理的 Function这些超时。 varargs 的第一个参数将是一个 AjaxOptions 对象,您可以选择使用它重新启动您的请求:$.ajax((AjaxOptions)args[0]);
    • 我尝试了同样的方法,......有时它正在工作......有时它会给出 timeoutError 并很快重试......并再次给出相同的错误,......如何识别和找出真正的原因??? ...
    【解决方案2】:

    类似的东西

    RetryPolicy retryPolicy = new DefaultRetryPolicy(
        YOUR_TIMEOUT_MS,
        YOUT_MAX_RETRIES,
        YOUR_BACKOFF_MULT
    );
    
    JsonObjectRequest request = new JsonObjectRequest(...);
    request.setRetryPolicy(retryPolicy);
    

    或者您可以实现自己的RetryPolicy。

    【讨论】:

      【解决方案3】:

      这对我有用:

      RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext());
      JsonObjectRequest request = new JsonObjectRequest(Method.GET, cityListUrl, null, new
          Listener<JSONObject>() {
              public void onResponse(JSONObject jsonResults) {
                  //Any Call
              }
          }, new ErrorListener(){
              public void onErrorResponse(VolleyError arg0) {
                  //Any Error log
              }
          }
      );
      
      
      int socketTimeout = 30000;//30 seconds - change to what you want
      RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
      request.setRetryPolicy(policy);
      mRequestQueue.add(request);
      

      【讨论】:

      • android studio 有点问题。但感谢一分钟或一小时解决我的问题.. 等待新的 ^_^
      【解决方案4】:
      void RequestVolley() {
      
          // Instantiate the RequestQuee
          RequestQueue queue = Volley.newRequestQueue(getApplication());
      
          //create new volley request
          JsonObjectRequest requestNew = new JsonObjectRequest(Request.Method.GET, Url, null, createMyReqSuccessListener(), createMyReqErrorListener());
      
          //Response.Listener and Error.Listener defined afterwards
      
      
          //first param is TIMEOUT ...integer
          //second param is number of retries ...integer
          //third is backoff multiplier ...integer
      
          requestNew.setRetryPolicy(new DefaultRetryPolicy(6000, 1, 1));
      
          queue.add(requestNew);
      }
      
      private Response.Listener < JSONObject > createMyReqSuccessListener() {
          return new Response.Listener < JSONObject > () {
              @Override
              public void onResponse(JSONObject response) {
      
                  //do something
              }
          };
      }
      
      private Response.ErrorListener createMyReqErrorListener() {
          return new Response.ErrorListener() {
              @Override
              public void onErrorResponse(VolleyError error) {
      
                  //do something
              }
          };
      }
      

      【讨论】:

        【解决方案5】:
        String url = "https://api.joind.in/v2.1/events?start=" + start + "&resultsperpage=20&format=json";
        Log.i("DREG", "onLoadMoreItems: " + url);
        final StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        // Add Code Here
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                            if (error instanceof NetworkError) {
                            } else if (error instanceof ServerError) {
                            } else if (error instanceof AuthFailureError) {
                            } else if (error instanceof ParseError) {
                            } else if (error instanceof NoConnectionError) {
                            } else if (error instanceof TimeoutError) {
                                Toast.makeText(getContext(),
                                        "Oops. Timeout error!",
                                        Toast.LENGTH_LONG).show();
                            }
                    }
                }
        );
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                10000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        requestQueue.add(stringRequest);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多