web-dev-qa-db-de.com

Wie kann ich die Wiederholung des Volley-Requests deaktivieren?

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?

23
xiaowoo

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

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

}
5
Dwivedi Ji

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

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.

0
mehmoodnisar125