2014-07-10 4 views
4

Lorsque je reçois une erreur dans de android volley demande que je souhaite réessayer la demande. Comment puis-je atteindre cet objectif?Réessayer demande onErrorResponse Android volley

+0

vous pouvez exécuter même demande à nouveau après avoir obtenu erreur délai d'attente, avez-vous essayé? – VinceStyling

+0

comment puis-je l'exécuter depuis onResponse? Dois-je utiliser le VolleyPorvider.addRequest() dans le onResponse? – user3009752

Répondre

7

bien, vous pouvez créer le RetryPolicy pour modifier le comportement de nouvelle tentative par défaut, ne spécifiez 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)); 
    } 
} 

l'autre façon est d'estimer la VolleyError, ré-exécuter à nouveau la même demande quand si était TimeoutError par exemple:

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

vous pouvez avoir une question à ce moment: « ont Volley offrir des méthodes de rappel de nouvelle tentative? », la réponse est « none ». mais il y a un appel de projet Netroid qui a basé Volley et satisfait la question précédée, avec cela, vous pouvez prendre un nouveau rappel si vous vous en souciez, vous pouvez calculer combien de temps utilisé quand réessayez et combien de temps cette requête exécute, le style de code comme ceci:

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 a également beaucoup d'autres fonctionnalités maniables et puissantes, j'espère que cela vous aidera assez :).

0

Vous pouvez définir la variable de compteur pour essayer de temps spécifique à ce qui en fait pleine récursive

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

vous pouvez également vérifier la réponse dans laquelle vous pouvez revenir de php et de traiter dans votre classe 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(); 
      } 

     } 

votre code PHP sera

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(); 
Questions connexes