Android 4.2上的httpurlconnection非常慢

我可以通过使用httpurlconnection成功地连接,发送和接收数据。 但是,在我的手机(Samsung s4,4.2)和android 4.2模拟器上加载所有数据需要很长时间。 但是在Android 2.3.x仿真器上加载图片需要将近1-2秒(非常快)。 比我的galaxy s4更快的http连接。

我正在使用AsyncTask,我的代码在两个工作正常。 它只是在Android 4.2s缓慢。 我尝试删除chunkedStreaming,保持活着,更改超时值等,但仍然没有成功

这是我的代码

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.setUseCaches(false); urlConnection.setChunkedStreamingMode(0); urlConnection.setRequestProperty("Connection", "Keep-Alive"); urlConnection.setConnectTimeout(6000); urlConnection.setReadTimeout(6000); urlConnection.setRequestProperty("Content-Type", "multipart/form-data;charset=UTF-8;boundary="+boundary); urlConnection.connect(); 

4.2和2.3.x的httpurlconnections是否有区别? 这里有什么不对

UPDATE!

我通过使用Log.e()来testing哪一行花费最多的时间。

 ///// other staff ////...... Log.e("HTTP","3"); if (isCancelled()) return (null); // don't forget to terminate this method Log.e("HTTP","3"); //Output DataOutputStream outputStream = new DataOutputStream( urlConnection.getOutputStream() ); //Send Passcode Log.e("HTTP","4"); 

在3和4之间,在线上5-6秒通过

 DataOutputStream outputStream = new DataOutputStream( urlConnection.getOutputStream() ); 

UPDATE!

该等待时间(请参阅上一个更新)与urlConnection.setConnectTimeout(6000)相关;

当我做超时1000,然后快速连接响应(等待线1秒)

 DataOutputStream outputStream = new DataOutputStream( urlConnection.getOutputStream() ); 

不知道为什么会发生这种情况

  • Android / Java:HttpURLConnection不会返回redirect文件的标题(例如在S3上)
  • Android KitKat HttpURLConnection断开AsyncTask
  • HttpUrlConnection.openConnection第二次失败
  • java.io.IOException:stream的意外结束
  • HttpURLConnection在Android 2.x中工作正常,但在4.1中没有:没有发现身份validation的挑战
  • Android HttpUrlConnection EOFException
  • HttpURLConnection.getResponseCode()在第二次调用时返回-1
  • 如何停止HttpURLConnection.getInputStream()?
  • 将urlConnection.setConnectTimeout()设置为较低的超时值。

    URLConnection.setConnectTimeout()的类文档说:

    设置连接时等待的最长时间(以毫秒为单位)。 如果在build立连接之前超时,则连接到服务器将会失败并返回SocketTimeoutException。 默认值0使我们做一个阻塞连接。 这并不意味着我们永远不会超时,但这可能意味着你会在几分钟后得到TCP超时。

    警告:如果主机名parsing为多个IP地址,则该客户端将按照RFC 3484的顺序进行尝试。 如果连接到这些地址中的每一个都失败,则在连接尝试引发exception之前将会经过多次超时。 支持IPv6和IPv4的主机名至less有2个IP地址。

    我最初有我的设置为urlConnection.setConnectTimeout(30000); 然后将其更改为urlConnection.setConnectTimeout(1000) 。 马上,我看到了更快的结果。

    希望这可以帮助!

    你提到你正在使用AsyncTask ,你想同时运行几个任务吗?

    如果是这样的话,你应该知道,从Android 4.0开始, AsyncTasks默认是序列化的。 这意味着执行者将一次执行一项任务

    如果你想保持以前的行为,你可以使用下面的结构:

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { myTask.execute(); } 

    看到这个博客文章了解更多信息:
    http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html