2014-01-22 4 views
35
RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
mRequestQueue.add(new JsonObjectRequest(Method.GET, cityListUrl, null, new Listener<JSONObject>() 
{ 
    public void onResponse(JSONObject jsonResults) 
    { 
     //Any Call 
    } 
}, new ErrorListener() 
    { 
     public void onErrorResponse(VolleyError arg0) 
     { 
      //Any Error log 
     } 
    } 
)); 

Dies ist mein Request Call und ich möchte Timeout für die Anfrage ändern oder einstellen. Ist das überhaupt möglich ??Volley RequestQueue Timeout

Antwort

112

Sie sollten die Anfrage des Set RetryPolicy:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
       MY_SOCKET_TIMEOUT_MS, 
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

Dies würde den Code ändern:

RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
JsonObjectRequest request = new JsonObjectRequest(Method.GET, cityListUrl, null, new 
    Listener<JSONObject>() { 
     public void onResponse(JSONObject jsonResults) { 
      //Any Call 
     } 
    }, new ErrorListener(){ 
     public void onErrorResponse(VolleyError arg0) { 
      //Any Error log 
     } 
    } 
); 


int socketTimeout = 30000;//30 seconds - change to what you want 
RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
request.setRetryPolicy(policy); 
mRequestQueue.add(request); 

Wenn Sie gerade erst mit Volley Sie beginnen, möchten Sie vielleicht stattdessen betrachten droidQuery, die ein wenig einfacher zu konfigurieren ist:

int socketTimeout = 30000; 
$.ajax(new AjaxOptions().url(cityListUrl) 
         .timeout(socketTimeout) 
         .success(new Function() { 
          public void invoke($ d, Object... args) { 
           JSONObject jsonResults = (JSONObject) args[0]; 
           //Any call 
          } 
         }) 
         .error(new Function() { 
          public void invoke($ d, Object... args) { 
           AjaxError error = (AjaxError) args[0]; 
           Log.e("Ajax", error.toString()); 
          } 
         })); 
+0

Gibt es eine OnTimeOut Methode? –

+1

@ Mr.Hyde Ich bin mir nicht bewusst, eine in * Volley *, aber Sie können dies in * DroidQuery * mit * statusCode() *, die ein Array von Statuscodes akzeptiert, die zurückgegeben werden können, und eine * Funktion *, So können Sie Timeout-Codes (480,419,504,503,522,598,599) und eine * Funktion * übergeben, die diese Timeouts behandelt. Das erste Argument des * varargs * ist ein * AjaxOptions * -Objekt, mit dem Sie Ihre Anfrage optional neu starten können: '$ .ajax ((AjaxOptions) args [0]);' – Phil

+0

Ich habe das gleiche versucht, ... einige mal funktioniert es .... irgendwann gibt es timeoutError und retries bald .... und gibt wieder die gleichen fehler, ... Wie erkennt man die eigentliche Ursache ??? ... – Bhuro

7

So etwas wie dieses

RetryPolicy retryPolicy = new DefaultRetryPolicy(
    YOUR_TIMEOUT_MS, 
    YOUT_MAX_RETRIES, 
    YOUR_BACKOFF_MULT 
); 

JsonObjectRequest request = new JsonObjectRequest(...); 
request.setRetryPolicy(retryPolicy); 

Oder Sie könnten Ihre eigene RetryPolicy implementieren.

4

Dies ist für mich gearbeitet:

RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
JsonObjectRequest request = new JsonObjectRequest(Method.GET, cityListUrl, null, new 
    Listener<JSONObject>() { 
     public void onResponse(JSONObject jsonResults) { 
      //Any Call 
     } 
    }, new ErrorListener(){ 
     public void onErrorResponse(VolleyError arg0) { 
      //Any Error log 
     } 
    } 
); 


int socketTimeout = 30000;//30 seconds - change to what you want 
RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
request.setRetryPolicy(policy); 
mRequestQueue.add(request); 
+0

Android Studio ist ein bisschen Buggy. aber danke für eine Minute oder eine Stunde, um meine Probleme zu lösen .. werde auf neue warten^_ ^ –

1
void RequestVolley() { 

    // Instantiate the RequestQuee 
    RequestQueue queue = Volley.newRequestQueue(getApplication()); 

    //create new volley request 
    JsonObjectRequest requestNew = new JsonObjectRequest(Request.Method.GET, Url, null, createMyReqSuccessListener(), createMyReqErrorListener()); 

    //Response.Listener and Error.Listener defined afterwards 


    //first param is TIMEOUT ...integer 
    //second param is number of retries ...integer 
    //third is backoff multiplier ...integer 

    requestNew.setRetryPolicy(new DefaultRetryPolicy(6000, 1, 1)); 

    queue.add(requestNew); 
} 

private Response.Listener <JSONObject> createMyReqSuccessListener() { 
    return new Response.Listener <JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 

      //do something 
     } 
    }; 
} 

private Response.ErrorListener createMyReqErrorListener() { 
    return new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

      //do something 
     } 
    }; 
} 
1
String url = "https://api.joind.in/v2.1/events?start=" + start + "&resultsperpage=20&format=json"; 
Log.i("DREG", "onLoadMoreItems: " + url); 
final StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
     new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       // Add Code Here 
      } 
     }, 
     new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
        if (error instanceof NetworkError) { 
        } else if (error instanceof ServerError) { 
        } else if (error instanceof AuthFailureError) { 
        } else if (error instanceof ParseError) { 
        } else if (error instanceof NoConnectionError) { 
        } else if (error instanceof TimeoutError) { 
         Toast.makeText(getContext(), 
           "Oops. Timeout error!", 
           Toast.LENGTH_LONG).show(); 
        } 
      } 
     } 
); 
stringRequest.setRetryPolicy(new DefaultRetryPolicy(
     10000, 
     DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
     DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
requestQueue.add(stringRequest);