更改排球超时时间
我使用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)
并将其调用。
这似乎是做这个工作。
对不起,我的懒惰的方式和万岁的开源。