修改抽射超时时间

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

我尝试添加以下代码:

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

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

是否有办法将超时更改为较长的值?

173698 次浏览

我最终添加了一个方法setCurrentTimeout(int timeout)RetryPolicy和它在DefaultRetryPolicy中的实现。

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

这似乎很管用。

顺便为我的懒惰道歉,为开源欢呼。

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

只是想用我的方法。正如已经回答的,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,所以我不会忘记为特定的请求设置策略的风险,如果一些特定的请求需要,你仍然可以覆盖它。

要处理Android Volley Timeout,你需要使用RetryPolicy

RetryPolicy

  • Volley提供了一种简单的方法来实现您的请求的RetryPolicy。
  • 排枪设置默认插座和放大器;ConnectionTImeout为5秒的所有请求。

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

它处理这三个参数

  • Timeout -指定套接字超时时间,单位为每一次重试。
  • Number Of Retries -重试次数。
  • 回退乘数-一个乘数,用于确定每次重试尝试设置到套接字的指数时间。

例如,如果用这些值创建了RetryPolicy

超时- 3000毫秒,重试次数- 2,回退倍数- 2.0

重试1:

  • time = time + (time * Back Off Multiplier);
  • 时间= 3000 + 6000 = 9000ms
  • Socket Timeout = time;
  • 请求发送时Socket超时为9秒

重试尝试2:

  • time = time + (time * Back Off Multiplier);
  • 时间= 9000 + 18000 = 27000ms
  • Socket Timeout = time;
  • 请求被发送,Socket超时27秒

因此,在重试2结束时,如果套接字超时仍然发生,Volley将在你的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));

如果以上所有解决方案都不适合您,请选择其他解决方案

默认情况下,Volley为setConnectionTimeout()setReadTimeout()设置相同的timeout,其值来自RetryPolicy。在我的例子中,Volley为大数据块抛出超时异常,请参阅:

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

我的解决方案是创建一个类,用我自己的setReadTimeout()策略扩展HttpStack。然后在创建RequestQueue时使用它,如下所示:

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示例

/**
* @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);
}
req.setRetryPolicy(new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

你可以将MY_SOCKET_TIMEOUT_MS设置为100。不管你想把它设成什么单位都是以毫秒为单位的。DEFAULT_MAX_RETRIES可以为0,默认为1。

int MY_SOCKET_TIMEOUT_MS=500;


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