Ich poste ein JsonRequest auf einem Server. Der Server ist langsam. Volley neigt dazu, mehrere Anrufe an den langsamen Server zu richten, da er von der ersten Anfrage keine Antwort erhielt (da mein Server langsam ist). Gibt es eine Möglichkeit, Volley daran zu hindern, eine Anforderung erneut zu versuchen, damit diese die erste Antwort erhalten kann?
Ich habe versucht:
myRequest.setRetryPolicy(new DefaultRetryPolicy(
TIMEOUT_MS,
RETRIES,
BACKOFF_MULT));
Ich habe TIMEOUT_MS = 0, RETRIES = 0 und sogar BACKOFF_MULT = 0 ersetzt, aber es funktioniert nicht.
Irgendwelche anderen Vorschläge?
Die Volley-Standardwiederholungsrichtlinie lautet:
/** The default socket timeout in milliseconds */
public static final int DEFAULT_TIMEOUT_MS = 2500;
/** The default number of retries */
public static final int DEFAULT_MAX_RETRIES = 1;
/** The default backoff multiplier */
public static final float DEFAULT_BACKOFF_MULT = 1f;
Sie finden es in DefaultRetryPolicy.Java,
sie können also sehen, dass Volleyball standardmäßig eine Wiederholungsanfrage durchführt.
Versuchen Sie, ein kleineres TIMEOUT zu verwenden (wenn Sie nicht die 2500ms warten möchten) oder größer als 2500ms, um die Antwort zu erhalten). Behalten Sie jedoch die anderen Werte bei.
// Wait 20 seconds and don't retry more than once
myRequest.setRetryPolicy(new DefaultRetryPolicy(
(int) TimeUnit.SECONDS.toMillis(20),
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Versuche dies,
// remove caching
jsObjRequest.setShouldCache(false);
// Wait 30 seconds and don't retry more than once
jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, 0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Methodenaufruf-Formularaufgabe
public void callWebService(JSONObject jsonRequest) {
JsonObjectRequest jsObjRequest = new JsonObjectRequest(
Request.Method.POST, url + pageurl, jsonRequest,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
sendResponse(jsonObject);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callBack.onError(error);
try {
if (progressDialog != null) {
progressDialog.dismiss();
progressDialog = null;
}
} catch (Exception e) {
Helper.customPrintStackTrace(e);
}
}
}
) {
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put(WebConfig.WebParams.APIKEY, Helper
.getStringValuefromPrefs(context,
SharedPreferencesKey.PREF_APIKEY));
params.put(WebConfig.WebParams.APITOKEN, Helper
.getStringValuefromPrefs(context,
SharedPreferencesKey.PREF_APITOKEN));
if (!Helper.getStringValuefromPrefs(context,
SharedPreferencesKey.PREF_USERID).equals("")) {
params.put(WebConfig.WebParams.USER_ID, Helper
.getStringValuefromPrefs(context,
SharedPreferencesKey.PREF_USERID));
} else {
params.put(WebConfig.WebParams.USER_ID, "0");
}
return params;
}
};
// remove caching
jsObjRequest.setShouldCache(false);
// Wait 30 seconds and don't retry more than once
jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, 0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
// Access the RequestQueue through your singleton class.
VolleySingleton.getInstance(context).addToRequestQueue(jsObjRequest);
if (showDefultProcess) {
progressDialog.show();
}
}
Um Volley die Wiederholung einer Anforderung zu stoppen, setzen Sie einfach die Wiederholungsrichtlinie der Anforderung auf eine DefaultRetryPolicy
, wobei maxNumRetries
0 ist
myRequest.setRetryPolicy(new DefaultRetryPolicy(
DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
0, // maxNumRetries = 0 means no retry
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Verwenden Sie Ihr StringRequest Object oder JsonObjectRequest Object oder JsonArrayRequest Object rufen Sie diese Methode auf.
Wenn das Objekt beispielsweise eine Instanz von StringRequest ist, ist hier die Methode:
stringRequest.setRetryPolicy(new DefaultRetryPolicy(initialTimeoutMs, maxNumRetries,
backoffMultiplier ));
initialTimeoutMs Das anfängliche Timeout für die Richtlinie.
maxNumRetries Die maximale Anzahl von Wiederholungen.
backoffMultiplier Backoff-Multiplikator für die Richtlinie.
Hier sind die Parameter, die ich angegeben habe.
stringRequest.setRetryPolicy(new DefaultRetryPolicy(10 * 1000, 0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Der erste Parameter sagt, dass InitialTimeout auf 10 Sekunden gesetzt wird.
Der zweite Parameter besagt, dass die Anzahl der gesetzten Wiederholungsversuche 0 ist.
Der dritte Parameter ist voreingestellt.