当我在android截击请求的OneErrorRepsonse中收到错误时,我想重试该请求。我怎样才能做到这一点?
您可以设置计数器变量来尝试特定的时间,而不使其完全递归
static int count=10; //so its will try ten time
public void userLogin(final View view)
{
final RequestQueue requestQueue= Volley.newRequestQueue(getApplicationContext());
String url = "http://192.168.43.107/mobodb/register.php";
StringRequest stringRequest=new StringRequest(Request.Method.POST,url,new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
Toast.makeText(getApplicationContext(),"Updated",Toast.LENGTH_LONG).show();
}
}
},new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
count=count-1;
Toast.makeText(getApplicationContext(),"Retry left"+count,Toast.LENGTH_LONG).show();
if (count>0) {
// note : may cause recursive invoke if always timeout.
userLogin(view);
}
else
{
Toast.makeText(getApplicationContext(),"Request failed pls check network connection or the error is "+error.getMessage(),Toast.LENGTH_LONG).show();
}
}
})
{
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> paramter=new HashMap<String,String>();
paramter.put("name",login_name);
paramter.put("user_pass",login_pass);
return paramter;
}
};
requestQueue.add(stringRequest);
stringRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 10, 1.0f));
你也可以检查里面的响应,你可以从php返回并在你的java类中处理
@Override
public void onResponse(String response) {
if(response.contains("no record found for"))
Toast.makeText(getApplicationContext(),response.toString(),Toast.LENGTH_LONG).show();
else
{
Toast.makeText(getApplicationContext(),"Updated num of row is"+response.toString(),Toast.LENGTH_LONG).show();
}
}
您的PHP代码将是
if($res){
$resp=mysql_affected_rows();
if($resp==0)
{
$resp="no record found for".$_POST['name'];
}
if($resp==1 or $resp>1)
{
$resp=mysql_affected_rows();
}else $resp="efrror is".mysql_error();
您可以创建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,当if是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();
}
}
}));
}
此时此刻,您可能会有一个问题:“Volley是否提供了一些重试回调方法?”,答案是“没有”。但是有一个项目调用Netroid,它基于截取并满足前面的问题,有了它,您可以进行重试回调,如果您关心这一点,您可以计算重试时使用的时间以及此请求执行的时间,代码样式如下:
final String REQUESTS_TAG = "Request-Demo";
String url = "http://facebook.com/";
JsonObjectRequest request = new JsonObjectRequest(url, null, new Listener<JSONObject>() {
long startTimeMs;
int retryCount;
@Override
public void onPreExecute() {
startTimeMs = SystemClock.elapsedRealtime();
}
@Override
public void onFinish() {
RequestQueue.add(request);
NetroidLog.e(REQUESTS_TAG);
}
@Override
public void onRetry() {
long executedTime = SystemClock.elapsedRealtime() - startTimeMs;
if (++retryCount > 5 || executedTime > 30000) {
NetroidLog.e("retryCount : " + retryCount + " executedTime : " + executedTime);
mQueue.cancelAll(REQUESTS_TAG);
} else {
NetroidLog.e(REQUESTS_TAG);
}
}
});
request.setRetryPolicy(new DefaultRetryPolicy(5000, 20, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
request.setTag(REQUESTS_TAG);
RequestQueue.add(request);
Netroid还有许多其他方便且功能强大的功能,希望能对您有所帮助:)。
我正在开发一个与我编写的RESTful网络服务通信的Android应用程序。在GET方法中使用Volley非常简单,但是我不能把我的手指放在POST方法上。 如何从我的post请求响应中获取字段这是我的响应 我想只有"访问令牌"内容 这是我的密码 请帮帮我?!
在Android WebView中有没有拦截重定向请求的方法?似乎不应该调用InterceptRequest(WebView,WebResourceRequest)! 我希望通过以下方式自动捕获所有web视图请求中的令牌过期: 从服务器发出重定向而不是401 使用shouldOverrideUrlLoading()在需要登录的情况下调用AppAuth 使用shouldInterceptReques
我使用Spring Boot,在保持与第三方REST服务的长期连接的同时,遇到了以下问题: 此服务可以在返回结果之前将连接保持一个小时或更长时间。 我的RestTemplate配置如下所示: 我能做些什么来修复我这边的问题吗,或者这是服务端的纯问题,应该在那里修复?
正如标题所说,我正在使用OAuth身份验证进行Angular 4项目。 每当http请求以状态代码401响应时,我将拦截该请求,续订访问令牌并重试失败的请求。 当我收到401时,请求被正确截获,访问令牌被刷新。失败的请求也会再次执行,但不再将其响应传递给组件。 因此,问题在于,我的组件(应该在请求响应上进行观察)在刷新令牌和重试请求之前,会抱怨视图的日志“接收属性时出错”。 我的拦截器: 我的服务
我的代码有一个问题,对我来说效果很好,但当我使用代理进行拦截时,它会向我发送一个双重请求。我想解决这个错误,只发送一次。我在查看网页时发现了一个类似的问题,但我对这种语言还不熟悉,不知道如何实现它。 当有慢速请求时,Android截击双发 我的代码:
例如,我试图向www.testjson发出GET请求。com/json,但响应是从不同的域URL检索的,例如www.testjson。com/confirmJson。 Spring mvc是否支持此功能,特别是restTemplate.exchange功能。 我目前正在做这类事情,但我得到一个500状态码(内部服务器错误),无法找出到底是什么导致了错误。 那么RestTemplate真的可以管理重