更改排球超时时间

我使用Android的新Volley框架来向我的服务器发出请求。 但是,在获得响应之前它会超时,尽pipe它确实做出了响应。

我试着添加这个代码:

HttpConnectionParams.setConnectionTimeout(httpParams, 5000); HttpConnectionParams.setSoTimeout(httpParams, timeoutMs); 

在Volley框架的HttpClientStack中以不同的整数(50000),但在50秒之前仍然超时。

有没有办法将超时更改为长期值?

请参阅Request.setRetryPolicy()DefaultRetryPolicy的构造函数,例如

 JsonObjectRequest myRequest = new JsonObjectRequest(Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "Error: " + error.getMessage()); } }); myRequest.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

要处理Android Volley超时,您需要使用RetryPolicy

RetryPolicy

  • Volley提供了一个简单的方法来实现您的请求的RetryPolicy。
  • 对于所有请求,排列设置默认Socket和ConnectionTImeout为5秒。

RetryPolicy是一个接口,您需要在发生超时时实现您想要重试特定请求的逻辑。

它处理这三个参数

  • 超时 – 以毫秒为单位指定Socket超时尝试次数。
  • 重试次数 – 尝试重试的次数。
  • 返回乘法器 – 一个乘法器,用于确定每个重试尝试的套接字的指数时间。

例如。 如果使用这些值创buildRetryPolicy

超时 – 3000毫秒,重试尝试次数 – 2次,closures倍数 – 2.0

重试尝试1:

  • time = time +(time * Back Off Multiplier);
  • 时间= 3000 + 6000 = 9000ms
  • 套接字超时=时间;
  • 请求派发与9秒的套接字超时

重试尝试2:

  • time = time +(time * Back Off Multiplier);
  • 时间= 9000 + 18000 = 27000ms
  • 套接字超时=时间;
  • 请求派遣与27秒的套接字超时

因此,在重试尝试2结束时,如果仍然发生套接字超时,那么排雷会在您的UI错误响应处理程序中抛出一个TimeoutError

 //Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions. //Volley does retry for you if you have specified the policy. jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

只是为了贡献我的方法。 如已经回答, RetryPolicy是要走的路。 但是,如果您需要的策略与所有请求的默认策略不同,则可以将其设置为基本的Request类,这样就无需为请求的所有实例设置策略。

像这样的东西:

 public class BaseRequest<T> extends Request<T> { public BaseRequest(int method, String url, Response.ErrorListener listener) { super(method, url, listener); setRetryPolicy(getMyOwnDefaultRetryPolicy()); } } 

在我的情况下,我有一个从此BaseRequest扩展的GsonRequest,所以我不会冒着为特定请求设置策略的风险,如果某些特定的请求需要,您仍然可以覆盖它。

 /** * @param request * @param <T> */ public <T> void addToRequestQueue(Request<T> request) { request.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); getRequestQueue().add(request); } 

如果以上所有解决scheme都不适合您,可以select其他解

默认情况下,Volley对来自RetryPolicy的值setConnectionTimeout()setReadTimeout()同时设置超时。 在我的情况下, Volley对大数据块引发超时exception请参阅:

 com.android.volley.toolbox.HurlStack.openConnection(). 

我的解决scheme是创build一个类扩展HttpStack与我自己的setReadTimeout()策略。 然后在创buildRequestQueue时使用它如下:

 Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack()) 

另一种方法是在自定义的JsonObjectRequest中:

 @Override public RetryPolicy getRetryPolicy() { // here you can write a custom retry policy and return it return super.getRetryPolicy(); } 

来源: Android Volley示例

我最后添加了一个方法setCurrentTimeout(int timeout)RetryPolicy ,它在DefaultRetryPolicy实现。

然后,我在Request类中添加了一个setCurrentTimeout(int timeout)并将其调用。

这似乎是做这个工作。

对不起,我的懒惰的方式和万岁的开源。