Android KitKat HttpURLConnection断开AsyncTask

时间:2013-11-20 18:49:22

标签: android android-asynctask httpurlconnection android-4.4-kitkat

在我的应用程序中,我使用HttpURLConnection中的AsyncTask下载文件。如果文件下载时间太长,那么我想取消它;我通过关闭流并在HttpURLConnection对象上调用disconnect()来完成此操作。这段代码在Android中运行了多年。但是,现在KitKat已经出局,问题就出现了。具体来说,disconnect()调用本身需要几秒或更长时间才能完成。在预KitKat设备中,它需要一毫秒或更短的时间。真正奇怪的是,当我在一个单独的线程上执行断开连接调用时,它真的很快。因此,必须在AsyncTask的{​​{1}}方法中调用它。需要注意的一点是,我的doInBackground确实有AsyncTask来电。

有谁知道KitKat和其他Android版本之间的区别是什么?我梳理了更改列表,没有看到与此问题相关的任何内容。

3 个答案:

答案 0 :(得分:0)

似乎Kitkat使用okhttp而不是之前的HTTPConnection实现,或者至少在具有官方更新的Nexus设备上就是这种情况。

答案 1 :(得分:0)

这可能与persistent connections有关,并且尝试HttpURLConnection重用相同的HTTP连接,因此当关闭连接或InputStream时,它会尝试通过读取和丢弃来消耗所有剩余数据。然后为下一个命令准备好相同的HTTP连接。

KitKat中似乎有一些新的实现会使事情变得不同并导致问题。

我尝试通过HTTP流式传输视频数据,偶尔寻找会导致关闭连接并启动新连接。当然,在这种情况下,我不需要提取视频流。

我试着打电话

HttpURLConnection con;
con.setRequestProperty("Connection", "close");

但它没有区别。

但是,我尝试使用DefaultHttpClient的相同代码并调用

HttpGet get = new HttpGet(uri);
get.addHeader("Connection", "close");

然后最后关闭连接的InputStream很快,我在调试器中通过步入ConnectionReuseStrategy.keepAlive并看到该服务器返回Connection:close和DefaultHttpClient没有尝试重用连接和读取直到结束。

因此,您可以使用DefaultHttpClient或找到一种方法使HttpURLConnection只关闭连接而无需阅读休息。

答案 2 :(得分:-1)

为什么不尝试使用apache lib http连接

在你的异步任务中

这样的东西

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://server.com");
    HttpResponse response = httpclient.execute(httppost);
    if(response!=null)
    {
        final  String responseBody =EntityUtils.toString(response.getEntity());
        if (responseBody != null) 
        {  



        }

    }