Retry request onErrorResponse Android volley
Asked Answered
H

2

7

When i receive an error in of android volley request i want to retry the request. How can i achieve this?

Hydrothorax answered 10/7, 2014 at 12:36 Comment(2)
you can execute same request again after you got timeout error, have you tried?Leastwise
how can i execute it from the onResponse? Should i use the VolleyPorvider.addRequest() in the onResponse?Hydrothorax
L
8

well, you can create the RetryPolicy to change default retry behavior, only specify timeout milliseconds, retry count arguments :

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));
    }
}

the another way is estimate the VolleyError, re-execute the same request again when if was TimeoutError instance :

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();
            }
        }
    }));
}

you may have a question at this very moment : "have Volley offer some retry callback methods ?", the answer is "none". but there have a project calls Netroid which based Volley and satisfy preceded question, with it, you can take a retry callback if you care about that, you can calculate how much time used when retry coming and how long this request execute, the code style like this :

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 also have many other handy and powerful features, hope that will help you enough :).

Leastwise answered 14/7, 2014 at 9:21 Comment(0)
W
0

You can set counter variable for trying specific time with out making it full recursive

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

you can also check response inside which you can return from php and deal in your java class

@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();
            }

        }

your PHP code will be

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();
Wolfhound answered 25/5, 2016 at 4:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.