@H_403_1@在某些情况下,我需要从客户端断开长轮询http请求.我对服务器的HttpUrlConnection的相关部分如下(以下所有代码都在Thread的run()方法中):
@H_403_1@
>然后一秒钟后,我尝试取消之前的请求
>预期的结果是,当我调用connection.disconnect()时,连接应抛出IOException @H_403_1@这正是各种仿真器(2.2 – 4.0.3),摩托罗拉Atrix(2.3.7)和三星Note(4.0.1)上发生的情况.但是在一些运行2.2的HTC设备上,尽管我明确终止了连接,但请求仍将保持活动并且它将收到响应.我用HTC Desire和HTC Wildfire验证了这一点. @H_403_1@这里发生了什么?如何在运行2.2的所有设备上安全取消此类请求? @H_403_1@为方便起见,如果您想自己试驾,可以在这里找到整个代码:https://gist.github.com/3306225
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();
}
}
}
@H_403_1@这是我第一次启动,然后(在第二次延迟后)尝试取消请求:
@H_403_1@
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);
@H_403_1@这就是cancelRequest()方法的样子:
@H_403_1@
public void cancelRequest() {
if (connection != null) {
connection.disconnect();
}
}
@H_403_1@基本上,
@H_403_1@>我使用get请求启动HttpUrlConnection,读取超时为1分钟>然后一秒钟后,我尝试取消之前的请求
>预期的结果是,当我调用connection.disconnect()时,连接应抛出IOException @H_403_1@这正是各种仿真器(2.2 – 4.0.3),摩托罗拉Atrix(2.3.7)和三星Note(4.0.1)上发生的情况.但是在一些运行2.2的HTC设备上,尽管我明确终止了连接,但请求仍将保持活动并且它将收到响应.我用HTC Desire和HTC Wildfire验证了这一点. @H_403_1@这里发生了什么?如何在运行2.2的所有设备上安全取消此类请求? @H_403_1@为方便起见,如果您想自己试驾,可以在这里找到整个代码:https://gist.github.com/3306225
最佳答案
这里发生了什么?
@H_403_1@这是早期Android版本(Froyo 2.2)中的已知错误,在排序中,套接字不能被其他线程异步关闭,并且已在Gingerbread 2.3中修复:
@H_403_1@Issue 11705: impossible to close HTTP connection using HttpURLConnection
@H_403_1@如何在运行2.2的所有设备上安全取消此类请求?
@H_403_1@该链接中项目成员的评论:
@H_403_1@
@H_403_1@The best approximation of this that will work in current releases is to set read and connect timeouts on the HTTP connection.@H_403_1@希望有所帮助.