Изменение продолжительности тайм-аута волейбола
Я использую новую инфраструктуру Volley для Android, чтобы выполнить запрос на мой сервер. Но это таймауты, прежде чем получить ответ, хотя он и отвечает.
Я попытался добавить этот код:
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
в HttpClientStack
рамки Volley для другого целого числа (50000), но он все еще не работает до 50 секунд.
Есть ли способ изменить тайм-аут на длинное значение?
Ответы
Ответ 1
См. 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));
Ответ 2
Чтобы обрабатывать тайм-аут волейбола Android, вам нужно использовать RetryPolicy
RetryPolicy
- Volley предоставляет простой способ реализовать RetryPolicy для ваших запросов.
- Volley устанавливает по умолчанию Socket и ConnectionTImeout до 5 секунд для всех запросов.
RetryPolicy
- это интерфейс, в котором вам нужно реализовать свою логику того, как вы хотите повторить определенный запрос, когда произойдет таймаут.
Он обрабатывает эти три параметра
- Таймаут - задает тайм-аут сокета в миллисекундах за каждую попытку повтора.
- Количество повторов - количество попыток повторения попыток.
- Back Off Multiplier - множитель, который используется для определения экспоненциального времени, установленного в socket для каждой попытки повтора.
Например, Если RetryPolicy создается с этими значениями
Тайм-аут - 3000 мс, количество попыток повтора - 2, множитель Back Off - 2.0
Повторить попытку 1:
- time = time + (time * Back Off Multiplier);
- время = 3000 + 6000 = 9000 мс
- Тайм-аут сокета = время;
- Запрос отправлен с таймером Socket 9 сек.
Повторить попытку 2:
- time = time + (time * Back Off Multiplier);
- time = 9000 + 18000 = 27000ms
- Тайм-аут сокета = время;
- Запрос отправлен с таймером Socket 27 сек.
Итак, в конце Retry Attempt 2, если все же произойдет Socket Timeout, Volley выбрал бы TimeoutError
в вашем обработчике ответов об ошибках UI.
//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));
Ответ 3
Просто чтобы внести свой вклад в мой подход. Как уже было сказано, RetryPolicy
- это путь. Но если вам нужна политика, отличная от по умолчанию для всех ваших запросов, вы можете установить ее в базовом классе Request, поэтому вам не нужно устанавливать политику для всех экземпляров ваших запросов.
Что-то вроде этого:
public class BaseRequest<T> extends Request<T> {
public BaseRequest(int method, String url, Response.ErrorListener listener) {
super(method, url, listener);
setRetryPolicy(getMyOwnDefaultRetryPolicy());
}
}
В моем случае у меня есть GsonRequest, который простирается от этого BaseRequest, поэтому я не рискую забыть установить политику для конкретного запроса, и вы все равно можете переопределить его, если требуется определенный запрос.
Ответ 4
/**
* @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);
}
Ответ 5
Альтернативное решение, если все вышеперечисленные решения не работают для вас
По умолчанию Volley устанавливает тайм-аут одинаково для setConnectionTimeout()
и setReadTimeout()
со значением от RetryPolicy
. В моем случае Volley
выдает исключение тайм-аута для большого блока данных:
com.android.volley.toolbox.HurlStack.openConnection().
Мое решение - создать класс, который расширяет HttpStack
с помощью моей собственной политики setReadTimeout()
. Затем используйте его при создании RequestQueue
следующим образом:
Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())
Ответ 6
В итоге я добавил метод setCurrentTimeout(int timeout)
в RetryPolicy
и его реализацию в DefaultRetryPolicy
.
Затем я добавил setCurrentTimeout(int timeout)
в класс Request и назвал его.
Это, похоже, выполняет эту работу.
Извините за мою лень, кстати и ура для открытого источника.
Ответ 7
Другой способ сделать это в пользовательском JsonObjectRequest:
@Override
public RetryPolicy getRetryPolicy() {
// here you can write a custom retry policy and return it
return super.getRetryPolicy();
}
Источник: Пример Android Volley