Android KitKat HttpURLConnection断开AsyncTask

在我的应用程序中,我使用AsyncTask中的HttpURLConnection下载了一个文件。 如果文件下载时间过长,我想取消它; 我通过closuresstream并调用HttpURLConnection对象上的disconnect()来完成此操作。 该代码在Android中已经运行了多年。 但是,现在KitKat已经出来,问题已经出现了。 具体来说, disconnect()调用本身需要几秒钟或更长时间才能完成。 在KitKat之前的设备中,花费了一毫秒甚至更less的时间。 真奇怪的是,当我在一个单独的线程上执行断开连接调用时,它真的又快了。 所以在AsyncTaskdoInBackground方法中调用它就成了一个问题。 有一点要注意的是,我的AsyncTask确实有一个Looper.prepare()调用。

有谁知道KitKat和其他Android版本有什么区别吗? 我梳理了更改列表,没有看到与这个问题有关的任何事情。

Solutions Collecting From Web of "Android KitKat HttpURLConnection断开AsyncTask"

看来,Kitkat使用okhttp而不是以前的HTTPConnection实现,或者至less在正式更新的Nexus设备上是这种情况。

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

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

我尝试通过HTTPstream式传输video数据,偶尔寻找导致closures连接并启动新连接的结果。 当然,在这种情况下,我不需要提取videostream。

我试图打电话

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

但没有什么区别。

不过,我尝试使用与DefaultHttpClient相同的代码并调用

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

然后最后closuresInputStream的连接是快速的,这是我在debugging器中进入ConnectionReuseStrategy.keepAlive并看到该服务器返回Connection:close和DefaultHttpClient没有尝试重用连接和读取直到结束。

所以你可以使用DefaultHttpClient或find一种方法使HttpURLConnection只是closures连接而不读取其余的。

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

像这样的东西,在你的asynchronous任务

  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) { } }