Как отключить HttpUrlConnection на телефонах HTC (Froyo и ниже )?

В некоторых случаях мне нужно отключить длинный HTTP-запрос опроса со стороны клиента. Соответствующая часть HttpUrlConnection, которую я делаю с сервером, выглядит следующим образом (весь приведенный ниже код находится в методе запуска потока ()):

try {
    URL url = new URL(requestURL);

    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Accept-Charset", "UTF-8");
    connection.setConnectTimeout(5 * 1000);
    connection.setReadTimeout(60 * 1000);
    connection.setRequestMethod("GET");

    // read the output from the server
    reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    StringBuilder stringBuilder = new StringBuilder();

    String line = null;
    while ((line = reader.readLine()) != null) {
        stringBuilder.append(line + "\n");
    }
    Log.d(TAG, stringBuilder);
} catch (IOException ioe) {
    Log.e(TAG, ioe);
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

Вот как я сначала инициирую, затем (после второй задержки )пытаюсь отменить запрос:

pollThread = new PollThread();
pollThread.start();
Log.d(TAG, "pollThread started");

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        pollThread.cancelRequest();
        Log.d(TAG, "pollThread presumably cancelled");
    }
}, 1000);

А вот как выглядит метод cancelRequest ():

public void cancelRequest() {
    if (connection != null) {
        connection.disconnect();
    }
}

По существу,

  1. Я инициирую HttpUrlConnection с запросом на получение с тайм-аутом чтения в 1 минуту
  2. Затем через одну секунду я пытаюсь отменить предыдущий запрос
  3. . Ожидаемый результат заключается в том, что соединение должно вызывать исключение IOException, когда я вызываю connection.disconnect ()

. И это именно то, что происходит на различных эмуляторах (2.2 -4.0.3 ), Motorola Atrix (2.3.7 )и Samsung Note (4.0.1 ). Но на некоторых устройствах HTC под управлением 2.2 запрос останется в силе и получит ответ, несмотря на то, что я явно разорвал соединение. Я проверил это на HTC Desire и HTC Wildfire.

Что тут происходит? Как я могу безопасно отменить такой запрос на всех устройствах с версией 2.2+?

Для вашего удобства весь код доступен здесь, если вы хотите провести тест-драйв самостоятельно:https://gist.github.com/3306225

5
задан EJoshuaS - Reinstate Monica 29 August 2017 в 18:05
поделиться