android – 如何断开HTC(Froyo及以下)手机上的HttpUrlConnection?

在某些情况下,我需要从客户端断开长轮询http请求.我对服务器的HttpUrlConnection的相关部分如下(以下所有代码都在Thread的run()方法中):

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();
    }
}

基本上,

>我使用get请求启动HttpUrlConnection,读取超时为1分钟
>然后一秒钟后,我尝试取消之前的请求
>预期的结果是,当我调用connection.disconnect()时,连接应抛出IOException

这正是各种仿真器(2.2 – 4.0.3),摩托罗拉Atrix(2.3.7)和三星Note(4.0.1)上发生的情况.但是在一些运行2.2的HTC设备上,尽管我明确终止了连接,但请求仍将保持活动并且它将收到响应.我用HTC Desire和HTC Wildfire验证了这一点.

这里发生了什么?如何在运行2.2的所有设备上安全取消此类请求?

为方便起见,如果您想自己试驾,可以在这里找到整个代码https://gist.github.com/3306225

最佳答案
这里发生了什么?

这是早期Android版本(Froyo 2.2)中的已知错误,在排序中,套接字不能被其他线程异步关闭,并且已在Gingerbread 2.3中修复:

Issue 11705: impossible to close HTTP connection using HttpURLConnection

如何在运行2.2的所有设备上安全取消此类请求?

链接中项目成员的评论

The best approximation of this that will work in current releases is to set read and connect timeouts on the HTTP connection.

希望有所帮助.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...