当前位置: 首页 > 知识库问答 >
问题:

重试请求上错误响应Android截击

罗烨霖
2023-03-14

当我在android截击请求的OneErrorRepsonse中收到错误时,我想重试该请求。我怎样才能做到这一点?

共有2个答案

曹浩波
2023-03-14

您可以设置计数器变量来尝试特定的时间,而不使其完全递归

  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();
公良鸿禧
2023-03-14

您可以创建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真的可以管理重