在我的应用程序中,我使用HttpURLConnection中的AsyncTask下载文件。如果文件下载时间太长,那么我想取消它;我通过关闭流并在HttpURLConnection
对象上调用disconnect()来完成此操作。这段代码在Android中运行了多年。但是,现在KitKat已经出局,问题就出现了。具体来说,disconnect()
调用本身需要几秒或更长时间才能完成。在预KitKat设备中,它需要一毫秒或更短的时间。真正奇怪的是,当我在一个单独的线程上执行断开连接调用时,它真的很快。因此,必须在AsyncTask
的{{1}}方法中调用它。需要注意的一点是,我的doInBackground
确实有AsyncTask
来电。
有谁知道KitKat和其他Android版本之间的区别是什么?我梳理了更改列表,没有看到与此问题相关的任何内容。
答案 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)
{
}
}