Изменение длительности тайм-аута залпа
Я использую новый Volley framework для Android, чтобы сделать запрос на мой сервер. Но это тайм-ауты, прежде чем получить ответ, хотя он отвечает.
Я попытался добавить этот код:
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
на HttpClientStack
фреймворка Volley для другого целого числа (50000), но он все еще тайм-аут до 50 секунд.
есть ли способ, чтобы изменить тайм-аут на длинное значение?
9 ответов:
посмотреть
Request.setRetryPolicy()
и конструктор дляDefaultRetryPolicy
, например,JsonObjectRequest myRequest = new JsonObjectRequest(Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "Error: " + error.getMessage()); } }); myRequest.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
для обработки Android Volley Timeout вам нужно использовать
RetryPolicy
RetryPolicy
- Volley обеспечивает простой способ реализации вашей RetryPolicy для ваших запросов.
- Volley устанавливает сокет по умолчанию и ConnectionTImeout до 5 секунд для всех запросов.
RetryPolicy
это интерфейс, в котором вам нужно реализовать свою логику того, как вы хотите повторить конкретный запрос, когда происходит тайм-аут.Он имеет дело с этими тремя параметрами
- тайм-аут - задает тайм-аут сокета в миллисекундах на каждую попытку повтора.
- количество попыток-количество попыток повторения.
- Back Off Multiplier-множитель, который используется для определения экспоненциального времени, установленного на сокет для каждой попытки повтора.
например. Если RetryPolicy создается с этими значениями
тайм-аут-3000 МС, число повторных попыток-2, отступить Множитель - 2.0
Повторите Попытку 1:
- time = time + (time * Back Off Multiplier);
- время = 3000 + 6000 = 9000ms
- тайм-аут сокета = время;
- запрос отправлен с таймаутом сокета 9 секунд
Повторите Попытку 2:
- time = time + (time * Back Off Multiplier);
- время = 9000 + 18000 = 27000ms
- тайм-аут сокета = время;
- запрос отправлен с таймаутом сокета 27 секунд
Итак, в конце Повторить Попытку 2 если все еще тайм-аут сокета происходит залп бросит
TimeoutError
в обработчике ответов на ошибки пользовательского интерфейса.//Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions. //Volley does retry for you if you have specified the policy. jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
просто внести свой вклад в подход. Как уже ответили,
RetryPolicy
- это путь. Но если вам нужна политика, отличная от default для всех ваших запросов, вы можете установить ее в базовом классе запросов, поэтому вам не нужно устанавливать политику для всех экземпляров ваших запросов.что-то вроде этого:
public class BaseRequest<T> extends Request<T> { public BaseRequest(int method, String url, Response.ErrorListener listener) { super(method, url, listener); setRetryPolicy(getMyOwnDefaultRetryPolicy()); } }
в моем случае у меня есть GsonRequest, который простирается от этого BaseRequest, поэтому я не рискую забыть установить политику для конкретного запрос и вы все еще можете переопределить это, если какой-то конкретный запрос требует.
/** * @param request * @param <T> */ public <T> void addToRequestQueue(Request<T> request) { request.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); getRequestQueue().add(request); }
req.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
вы можете установить
MY_SOCKET_TIMEOUT_MS
как 100. Все, что вы хотите установить в миллисекундах.DEFAULT_MAX_RETRIES
может быть 0 по умолчанию-1.
int MY_SOCKET_TIMEOUT_MS=500; stringRequest.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
альтернативное решение, если все вышеперечисленные решения не работают для вас
по умолчанию, залп установить тайм-аут одинаково для обоих
setConnectionTimeout()
иsetReadTimeout()
значением отRetryPolicy
. В моем случае,Volley
выбрасывает исключение таймаута для большого куска данных см.:com.android.volley.toolbox.HurlStack.openConnection().
мое решение-создать класс, который расширяет
HttpStack
своимиsetReadTimeout()
политика. Затем используйте его, когда создаетRequestQueue
следующим образом:Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())
другой способ сделать это-в пользовательском JsonObjectRequest by:
@Override public RetryPolicy getRetryPolicy() { // here you can write a custom retry policy and return it return super.getRetryPolicy(); }
источник: Android Volley Пример