В некоторых случаях мне нужно отключить длинный 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();
}
}
По существу,
. И это именно то, что происходит на различных эмуляторах (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