12

我可以使用 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 有什么区别吗?这里有什么问题

更新!

我使用 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() );

更新!!

该等待时间(请参阅以前的更新)与 urlConnection.setConnectTimeout(6000);

当我设置超时 1000 时,连接响应很快(等待 1 秒)

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

不知道为什么会这样

4

2 回答 2

4

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

URLConnection.setConnectTimeout() 的类文档说:

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

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

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

希望这可以帮助!

于 2013-11-20T22:54:45.833 回答
1

您提到您正在使用AsyncTask,您是否尝试同时运行多个任务?

如果是这种情况,您应该知道从 Android 4.0开始,默认情况下AsyncTasks序列化的。这意味着 executor 将一次运行一个任务

如果要保留以前的行为,可以使用以下构造:

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

于 2013-11-09T00:33:58.087 回答