當我收到一個錯誤onerrorrepsonse android volley請求我想重試請求。我怎樣才能做到這一點?重試請求onErrorResponse Android凌空
4
A
回答
7
好了,你可以創建RetryPolicy
改變默認的重試操作,只有指定timeout milliseconds
,retry 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();
相關問題
- 1. 凌空手柄onErrorResponse
- 2. 凌空onErrorResponse給NullPointerException異常
- 3. 如何調試凌空請求發送
- 4. Android的凌空RxJava - 多請求
- 5. Android凌空自定義請求
- 6. Android Volley請求身份onErrorResponse部分
- 7. 凌空取消請求
- 8. 凌空請求機制
- 9. Android的凌空如何使用凌空
- 10. 凌空第二請求返回空
- 11. Android的凌空緩存
- 12. 凌空onResponse的Android不行
- 13. 凌空JSON請求不給我響應
- 14. 凌空JsonArrayRequest POST請求不工作
- 15. 凌空請求隊列返回null
- 16. 凌空用GET請求和參數
- 17. 凌空內存泄漏請求
- 18. Android的凌空SERVERERROR
- 19. 如何編寫單元測試用例凌空JSON請求
- 20. 如何與Android凌空
- 21. Android凌空 - 當所有請求完成時得到回調
- 22. 發送請求和響應拿到餅乾與Android凌空
- 23. 獲得500錯誤凌空PUT請求的Android
- 24. 發送數據請求(無JSON)凌空android
- 25. 當所有請求完成時,Android凌空獲得回調
- 26. Android的凌空字符串請求響應串
- 27. 的Android使用凌空
- 28. android登錄凌空錯誤
- 29. Android的凌空圖書館
- 30. 使用凌空
,你可以執行你得到超時錯誤後,再次相同的請求,你試過嗎? – VinceStyling
我該如何從onResponse執行它?我應該在onResponse中使用VolleyPorvider.addRequest()嗎? – user3009752