8

在我的应用程序中,我使用AsyncTask中的HttpURLConnection下载文件。如果文件下载时间过长,那么我想取消它;我通过关闭流并在对象上调用disconnect()来做到这一点。多年来,该代码在 Android 中完美运行。然而,既然 KitKat 出来了,问题就出现了。具体来说,调用本身需要几秒钟或更长时间才能完成。在 KitKat 之前的设备中,它需要一毫秒或更短的时间。真正奇怪的是,当我在单独的线程上执行断开调用时,它又真的很快了。因此,在'方法中调用它必须是一个问题。需要注意的一件事是,我的确实有HttpURLConnectiondisconnect()AsyncTaskdoInBackgroundAsyncTaskLooper.prepare()称呼。

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

4

3 回答 3

0

这可能与持久连接有关,以及 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 仅关闭连接而无需阅读休息。

于 2014-03-19T09:48:45.807 回答
0

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

于 2013-12-04T09:36:46.650 回答
-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) 
        {  



        }

    }
于 2013-12-18T14:39:32.607 回答