2014-07-10 48 views

回答

7

好了,你可以创建RetryPolicy改变默认的重试操作,只有指定timeout millisecondsretry count参数:

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,重新执行相同的请求时,如果是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也有许多其他方便和强大的功能,希望能够帮到你足够:)。

0

可以设置计数器变量试图与出特定的时间使其完全递归

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