Подтвердить что ты не робот

Как отключить запрос Volley от повторной попытки?

Я отправляю JsonRequest на сервер. Сервер работает медленно. Volley имеет тенденцию делать несколько вызовов на медленном сервере, потому что он не получил ответа от первого запроса (поскольку мой сервер работает медленно). Есть ли способ отключить Volley от повторной попытки запроса, чтобы он мог получить первый ответ?

Я пробовал:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
                TIMEOUT_MS, 
                RETRIES, 
                BACKOFF_MULT)); 

Я заменил TIMEOUT_MS = 0, RETRIES = 0 и даже BACKOFF_MULT = 0, но он не работает.

Любые другие предложения?

4b9b3361

Ответ 1

Политика повторных попыток залпа по умолчанию:

/** 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;

Вы можете найти его в DefaultRetryPolicy.java,

так что вы можете видеть, что залп делает 1 запрос на повтор по умолчанию.

Попробуйте использовать меньшее значение TIMEOUT (если вы не хотите ждать 2500 мс) или больше 2500 мс, чтобы получить ответ), но оставьте другие значения, например:

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

Следовательно, чтобы отключить повторный запуск Volley, вам необходимо выполнить:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
       (int) TimeUnit.SECONDS.toMillis(20), //After the set time elapses the request will timeout
       0,
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Ответ 2

Попробуйте это,

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

Задача формы вызова метода

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

}

Ответ 3

Чтобы не дать Volley повторить запрос, просто установите для политики повторения запроса значение DefaultRetryPolicy с maxNumRetries 0:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
    DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
    0,  // maxNumRetries = 0 means no retry
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Ответ 4

Использование вашего объекта StringRequest, объекта JsonObjectRequest или объекта JsonArrayRequest вызывает этот метод.

Например, если объект является экземпляром StringRequest, вот метод:

stringRequest.setRetryPolicy(new DefaultRetryPolicy(initialTimeoutMs, maxNumRetries,
               backoffMultiplier ));

initialTimeoutMs Начальное время ожидания для политики.

maxNumRetries Максимальное количество попыток.

backoffMultiplier Множитель отката для политики.

Ниже приведены параметры, которые я дал.

stringRequest.setRetryPolicy(new DefaultRetryPolicy(10 * 1000, 0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Первый параметр говорит, установите InitialTimeout в 10 секунд.

Второй параметр говорит, что установленное количество попыток пытается 0.

Третий параметр по умолчанию.