Тайм-аут для запроса сервера, сделанного с помощью "Volley", только на Android, а не на iOS
В одном из моих приложений я отправляю запрос на сервер с помощью volley
, предоставляемого Google.
Проблема: объект ожидания и ошибки имеет значение null на onErrorResponse(VolleyError error)
Что я пробовал до сих пор:
1) Сначала я получил нулевой объект ошибки, поэтому решил его использовать с помощью кода ниже:
@Override
protected void deliverResponse(String response) {
super.deliverResponse(response);
}
@Override
public void deliverError(VolleyError error) {
super.deliverError(error);
DebugLog.e("deliverResponse", "getNetworkTimeMs : " + error.getNetworkTimeMs());
}
До сих пор я обнаружил, что существует timeout
, когда я получил объект ошибки null
.
2) Теперь приложение предназначено для Android
и iOS
и web
, но timeout
происходит только для Android
.
Журнал волейбола для запросов:
BasicNetwork.logSlowRequests: HTTP response for request
Отредактированное примечание:
-
Веб-службы, созданные на сервере, одинаковы для всех трех экземпляров (Android, Web и iOS).
-
timeout
происходит, когда слишком много пользователей делают запросы на сервер.
-
Я установил время до 2 минут, хотя волейбол бросает таймаут за 30 секунд только иногда.
-
У меня есть много ответов на изменение сервера, но так как это невозможно, так что любое другое решение, пожалуйста.
Я также хотел бы добавить, что если я могу получить больше информации о том, когда таймаут может быть возможен в залпе?
Ссылки Я прошел через:
Оптимизация волейбола
httpclient-often-times-out-using-wifi-is-going-fine-with-3g
long_xmlhttprequest_ajax_requests_timeout_on_android
Отредактировано:
Я также установил политику повтора, как показано ниже:
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48,
0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
А также я не хочу повторять, если время ожидания соединения.
Как я могу сделать эффективный вызов службы, который может решить проблему для timeout
.
Любая помощь будет назначена.
Спасибо.
Ответы
Ответ 1
Как я пытался получить решение этой проблемы около двух месяцев, я не получил никакого идеального решения. Хотя я анализирую некоторые факты, как показано ниже:
- Вы можете обновить производительность своего сервера.
- Я пробовал сделать запрос веб-сервиса, используя
HttpURLConnection
, но все же получаю такую же проблему.
Итак, я думаю, что эта проблема не связана с волейболом, но вы получаете эту проблему, тогда я бы предложил увеличить производительность сервера с настройкой ниже RetryPolicy
:
int x=2;// retry count
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48,
x, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Надеюсь, это поможет.
Предложения всегда приветствуются:)
Прокомментируйте ниже, если вы нашли более правильное решение.
Спасибо.
Ответ 2
IMHO, вы можете обратиться к следующему:
Внутри BasicNetwork.java
вы найдете некоторую информацию, например:
...
private static int SLOW_REQUEST_THRESHOLD_MS = 3000;
...
/**
* Logs requests that took over SLOW_REQUEST_THRESHOLD_MS to complete.
*/
private void logSlowRequests(long requestLifetime, Request<?> request,
byte[] responseContents, StatusLine statusLine) {
if (DEBUG || requestLifetime > SLOW_REQUEST_THRESHOLD_MS) {
VolleyLog.d("HTTP response for request=<%s> [lifetime=%d], [size=%s], " +
"[rc=%d], [retryCount=%s]", request, requestLifetime,
responseContents != null ? responseContents.length : "null",
statusLine.getStatusCode(), request.getRetryPolicy().getCurrentRetryCount());
}
}
...
// if the request is slow, log it.
long requestLifetime = SystemClock.elapsedRealtime() - requestStart;
logSlowRequests(requestLifetime, request, responseContents, statusLine);
...
Итак, если ваш проект использует Google volley в качестве модуля (а не JAR файл), вы можете обновить BasicNetwork.java
, увеличив SLOW_REQUEST_THRESHOLD_MS
значение, возможно, 10000 (мс) или больше, например.
Другая опция, согласно @neuron, ответит на следующий вопрос:
Как оптимизировать сетевой прием в андроид-волейбол? (Volley Google IO 2013)
Я думаю, вы можете попробовать увеличить значение NETWORK_THREAD_POOL_SIZE, используя следующий конструктор в своем приложении:
public RequestQueue(Cache cache, Network network, int threadPoolSize) {
this(cache, network, threadPoolSize,
new ExecutorDelivery(new Handler(Looper.getMainLooper()))); }
P/S: если вы хотите, чтобы строки BasicNetwork.logSlowRequests: HTTP response for request
больше не отображались без увеличения NETWORK_THREAD_POOL_SIZE, нужно только прокомментировать (//
) строку logSlowRequests...
выше (когда ваше приложение использует Google volley как модуль - не файл jar, а не compile mcxiaoke...
в build.gradle
файле)
Надеюсь, что это поможет!
Ответ 3
public class JGet extends Request {
private final Response.Listener listener;
public JGet(final String url, List params,
Response.Listener responseListener) {
super(Request.Method.GET, NetUtils.getUrlWithParams(url, params), new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
NetUtils.dealVolleyError(volleyError, url);
}
});
this.listener = responseListener;
this.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0, 1.0f));
LogUtils.e("request-start--->");
LogUtils.e(url);
LogUtils.e(params);
LogUtils.e("request-start--->");
}
}
установить время ожидания.
Ответ 4
Не пытайтесь использовать оператор require для подключения к вашей базе данных при отправке запроса в файл PHP с использованием volley.
Я заметил тайм-аут только тогда, когда я использую что-то вроде (требуется "init.php" )
Но когда я напрямую помещал свою информацию о соединении с БД в тот же файл, все, кажется, работает нормально.
Ответ 5
request.setRetryPolicy (новый DefaultRetryPolicy (50000, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT))