Остановка молчащих попыток в HttpURLConnection

Я использую HttpURLConnection в Android KitKat для отправки некоторых данных на сервер. Сервер требует много времени, чтобы ответить, и соединение тихо повторяет 1 - 3 раза до истечения времени. Я не хочу, чтобы он повторил попытку, так как сервер действует на все запросы, что приводит к Bad Things (TM).

Я пробовал System.setProperty("http.keepAlive", "false"), прежде чем открывать соединение, но это не помогает.

Ответ 1

Для вызовов POST

httpURLConnection.setChunkedStreamingMode(0);

и это должно исправить молчание. Отчет об ошибке и обходной путь можно найти здесь.

Ответ 2

  • Внедрите жесткий тайм-аут самостоятельно и принудительно закройте 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. Это установит тайм-аут сокета.

Ответ 3

Вам нужно установить System.setProperty("sun.net.http.retryPost", "false")

Ответ 4

Андроидные HTTP-клиенты

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