Тайм-аут для запроса сервера, сделанный с использованием «Volley» только на Android, а не на iOS

В одном из моих приложений я отправляю запрос на сервер, используя volley предоставленный Google .

Проблема: время ожидания и объект ошибки имеют значение null on 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 

Отредактированное примечание:

  1. Веб-службы, разработанные на сервере, одинаковы для всех трех экземпляров (Android, Web и iOS).

  2. Timeout происходит, когда слишком много пользователей делают запросы на сервер.

  3. Я установил время до 2 минут, хотя волейбол бросает таймаут через 30 секунд только иногда .

  4. У меня много ответов на смену сервера, но, как это невозможно, любое другое решение, пожалуйста.

Я также хотел бы добавить, что если я могу получить больше информации о том, когда таймаут может быть возможен в залпе?

Ссылки Я прошел через:

Оптимизация волейбола

HttpClient-часто раз-из-используя WiFi-это-происходит мелкодисперсной-с-3g

long_xmlhttprequest_ajax_requests_timeout_on_android

Отредактировано:

Я также установил политику повтора, как показано ниже:

 request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

А также я не хочу повторять попытку, если время ожидания соединения.

Как я могу сделать эффективный вызов службы, который может решить проблему для timeout .

Любая помощь будет назначена.

Благодарю.

Solutions Collecting From Web of "Тайм-аут для запроса сервера, сделанный с использованием «Volley» только на Android, а не на iOS"

Поскольку я пытался получить решение этой проблемы в течение двух месяцев, я не получил никакого идеального решения. Хотя я анализирую некоторые факты, как показано ниже:

  1. Вы можете повысить производительность своего сервера
  2. Я попытался сделать запрос веб-сервиса, используя HttpURLConnection но все еще получаю HttpURLConnection же проблему.

Поэтому я думаю, что эта проблема не специфична для волейбола, но вы получаете эту проблему, тогда я бы предложил увеличить производительность сервера с настройкой ниже RetryPolicy :

 int x=2;// retry count request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48, x, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

Надеюсь, это поможет.

Предложения всегда приветствуются 🙂

Пожалуйста, прокомментируйте ниже, если вы нашли более подходящее решение.

Благодаря.!

ИМХО, вы можете обратиться к следующему:

Внутри 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 в качестве модуля (а не JAR-файл), вы можете обновить BasicNetwork.java , увеличив значение SLOW_REQUEST_THRESHOLD_MS , например, 10000 (мс) или больше.

Другой вариант, согласно ответу @ neuron на следующий вопрос:

Как оптимизировать сетевую очередь в android Volley? (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 в качестве модуля – не файл jar, а не compile mcxiaoke... в файле build.gradle )

Надеюсь, поможет!

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

Установить время ожидания.