在Android 4.2上,httpurlconnection非常慢

时间:2013-11-08 23:10:40

标签: android httpurlconnection android-4.2-jelly-bean android-2.3-gingerbread

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

我正在使用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()来测试哪一行占用了大部分时间。

///// 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() );

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

2 个答案:

答案 0 :(得分:3)

将urlConnection.setConnectTimeout()设置为较低的超时。

URLConnection.setConnectTimeout()的类文档说:

  

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

     

警告:如果主机名解析为多个IP地址,则为此   客户端将按RFC 3484顺序尝试每个。如果连接到这些中的每一个   地址失败,连接前会经过多次超时   尝试抛出异常。支持IPv6和IPv6的主机名   IPv4始终至少有2个IP地址。

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

希望这有帮助!

答案 1 :(得分:1)

您提到您正在使用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