Странная проблема с таймаутами подключения и Google Volley

У меня есть приложение для Android, которое использует Google Volley для выполнения запросов к серверной части веб-сервера (http://www.example.com/request.php). Код, который запрашивает веб-страницу, вызывается, когда пользователь перемещает карту.

Проблема в том, что иногда запрос не выполняется. Когда это не удается, я открываю свой браузер Chrome (также на телефоне) и перехожу на эту внутреннюю страницу «request.php». Запрос завершается с ошибкой тайм-аута соединения. Затем я нажимаю «Обновить» в Chrome, и он загружается правильно. Я снова открываю свое приложение, и тогда все снова работает нормально, то есть: запрос проходит.

Действия, которые я предпринял для отладки:

  1. Я переключился с асинхронной библиотеки com.loopj на Google Volley -> все еще есть ошибки тайм-аута

  2. Запрошена другая страница (например: stackoverflow.com вместо example.com/request.php) при перемещении карты -> ошибок нет

  3. Добавил эту строку в htaccess на сервере: RewriteRule (.*) - [E=Cache-Control:no-cache], потому что у меня были проблемы с x-litespeed-cache, обслуживающим кешированные страницы до -> все еще есть ошибки тайм-аута

  4. Пробовал на нескольких устройствах и эмуляторах Android -> все еще случайным образом возникают ошибки тайм-аута

  5. Подал заявку на мой веб-хост с вопросом, заметили ли они какие-либо ошибки тайм-аута на моей странице -> они сказали нет

Вот мой код:

public void updateMarkers() {
    params = new HashMap<String, String>();
    params.put("mykey", "myvalue");
    StringRequest fpsr = new StringRequest(Method.POST, "http://www.example.com/request.php", new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            //do stuff with the response
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //do stuff with error
        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            return params;
        }
    };
    ApplicationController.getInstance().addToRequestQueue(fpsr, "updateMarkers");
}    

И ApplicationController.java такой же, как здесь: http://www.androidhive.info/2014/05/android-working-with-volley-library-1/

Я очень сомневаюсь, что в коде есть проблемы, поскольку запросы к страницам, отличным от моих, никогда не вызывают проблем.

Странно то, что мой веб-хост сказал, что не заметил никаких ошибок тайм-аута. Но даже при посещении страницы в Chrome для Android были ошибки тайм-аута, которые исчезали только при нажатии кнопки «Обновить».

Кто-нибудь может пролить свет на это? Большое спасибо!

Кроме того, у меня нет кода ответа HTTP от VolleyError. Причина в том, что он дает сбой случайным образом, и я не всегда подключаю телефон к компьютеру, чтобы увидеть logcat. Кроме того, я пытался зарегистрировать error.networkResponse.statusCode раньше; это привело к сбою приложения из-за исключения нулевого указателя.


person Michael    schedule 08.11.2014    source источник
comment
Я бы попробовал посетить вашу страницу с компьютера и проверить, есть ли у вас тайм-ауты, вы также можете попробовать переместить свой сервер на локальный сервер, чтобы убедиться, что вы знаете, что происходит с веб-сервером.   -  person Gabriel Netto    schedule 08.11.2014
comment
Ваш сервер может быть немного перегружен. Добавьте повтор! stackoverflow.com/a/24733287/794088 (не забудьте проголосовать, если сочтете это полезным)   -  person petey    schedule 08.11.2014
comment
Страница не имеет времени ожидания на компьютере, когда это происходит на мобильном устройстве. Кроме того, я не думаю, что повторная попытка сработает. Время ожидания истекает и в браузере Chrome (пока я не нажму «Обновить» после ошибки)   -  person Michael    schedule 08.11.2014
comment
Хорошо, я попытался реализовать повторы. Это все еще дает мне ошибки тайм-аута случайным образом.   -  person Michael    schedule 08.11.2014