Android http keepalive решение, но оно постоянное? - PullRequest
5 голосов
/ 14 ноября 2011

У меня есть кнопка поиска, которая обращается к серверу при каждом нажатии. Проблема в том, что если я нажму его несколько раз подряд, он будет работать нормально. Однако, если я подожду 5 секунд, первое нажатие не будет работать. Он просто не получает ответ. Второе нажатие будет работать, как и последующие нажатия, пока я не подожду определенное время (~ 5 секунд)

В общем, если вы не ищите новые вещи в течение 5 секунд, первое нажатие кнопки ничего не даст.

Это решается с помощью

          System.setProperty("http.keepAlive", "false");

Тем не менее, я читал, что это избавляет от постоянных соединений, когда каждый раз, когда я нажимаю эту кнопку, необходимо устанавливать новое TCP-соединение. Это медленнее, но не глючит.

Это плохое исправление? Я читал, что это ничего не исправляет. Хотелось бы помочь, спасибо.

Ответы [ 2 ]

5 голосов
/ 17 сентября 2012

Вы сказали:

Однако, если я подожду 5 секунд, первое нажатие не будет работать. Он просто не получает ответ.

Я думаю, что сервер даже не получает запрос в вашем случае. Я думаю, что установка http.keepAlive в false является хорошим решением. Я потратил немало времени на изучение этой проблемы, и более чем очевидно, что это ошибка в библиотеке Android.

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

Отключение http.keepAlive - это обходной путь, а не решение, однако вы получаете надежную обработку HTTP, хотя и с некоторыми затратами производительности.

0 голосов
/ 14 ноября 2011

ClientConnectionManager внутренне управляет управляемыми соединениями, но передает экземпляры ManagedClientConnection. Этот интерфейс абстрагируется от базовых операций с сокетами и предоставляет удобные методы для открытия и обновления сокетов для установления маршрута. Оператор инкапсулируется менеджером соединений и вызывается автоматически.

org.apache.http.conn

...