Ответ 1
Для вызовов POST
httpURLConnection.setChunkedStreamingMode(0);
и это должно исправить молчание. Отчет об ошибке и обходной путь можно найти здесь.
Я использую HttpURLConnection
в Android KitKat для отправки некоторых данных на сервер. Сервер требует много времени, чтобы ответить, и соединение тихо повторяет 1 - 3 раза до истечения времени. Я не хочу, чтобы он повторил попытку, так как сервер действует на все запросы, что приводит к Bad Things (TM).
Я пробовал System.setProperty("http.keepAlive", "false")
, прежде чем открывать соединение, но это не помогает.
Для вызовов POST
httpURLConnection.setChunkedStreamingMode(0);
и это должно исправить молчание. Отчет об ошибке и обходной путь можно найти здесь.
Внедрите жесткий тайм-аут самостоятельно и принудительно закройте HttpURLConnection
вызов disconnect
. Это можно сделать с помощью Activity
с помощью android handler
; Если вы используете AsyncTask
, вы можете просто вызвать cancel
или Thread.interrupt()
:
new Handler().postDelayed(new Runnable() {
public void run() {
httpUrlConnTask.cancel(true);
}
}, timeout * 1000);
И в своем httpUrlConnTask
вызовите disconnect
:
if (isCancelled()) {
urlConnection.disconnect();
return;
}
Возможно, вам придется выполнить urlConnection
в другом внутреннем потоке потомков, чтобы вы могли сделать цикл while
в мониторинге асинхронности для isCancelled
. И try..catch
, чтобы вы могли корректно закрыть все потоки.
у вас уже есть keepAlive
false и readTimeout
, подумайте о добавлении connection timeout too
. Это установит тайм-аут сокета.
Вам нужно установить System.setProperty("sun.net.http.retryPost", "false")
До Froyo HttpURLConnection
были некоторые разочаровывающие ошибки. В частности, вызов close() на читаемом InputStream может отражать пул соединений. Обходите это, отключив пул соединений:
private void disableConnectionReuseIfNecessary() {
// HTTP connection reuse which was buggy pre-froyo
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
}