Android HttpURLConnection.getInputStream非常慢
与使用相同服务器端服务的iPhone应用程序相比,HttpURLConnection.getInputStream需要花费很多时间 以下代码用于该服务:Android HttpURLConnection.getInputStream非常慢,android,inputstream,httpurlconnection,androidhttpclient,Android,Inputstream,Httpurlconnection,Androidhttpclient,与使用相同服务器端服务的iPhone应用程序相比,HttpURLConnection.getInputStream需要花费很多时间 以下代码用于该服务: date= new java.util.Date(); Log.d("time","Time Stamp before posting "+new Timestamp(date.getTime())); URL ur= new URL(url);
date= new java.util.Date();
Log.d("time","Time Stamp before posting "+new Timestamp(date.getTime()));
URL ur= new URL(url);
HttpURLConnection conn = (HttpURLConnection) ur.openConnection();
conn.setRequestProperty("Connection", "close");
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(getQuery(nameValuePairs));
writer.close();
os.close();
conn.connect();
StringBuffer response=null;
try{
Log.d("time","Time Stamp bfr InputStream "+new Timestamp(date.getTime()));
InputStream is = conn.getInputStream();
date= new java.util.Date();
Log.d("time","Time Stamp aftr InputStream "+new Timestamp(date.getTime()));
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
response = new StringBuffer();
while((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
response.toString();
result=response.toString();
} catch (Exception e) {
}
为了检查服务在哪里花费时间,我将日志条目放在打印时间戳上
该过程的平均时间如下所示:
发送到服务器的平均时间少于2 Mil秒创建输入流的平均时间约为5秒 写入响应的平均时间小于2密耳秒
你知道为什么输入流需要很长的时间,这使得整个服务非常慢吗?将urlConnection.setConnectTimeout()设置为较低的超时 URLConnection.setConnectTimeout()的类文档说明: 设置连接时等待的最长时间(毫秒)。如果在建立连接之前超时,则连接到服务器将失败,并出现SocketTimeoutException。默认值0导致我们进行阻塞连接。这并不意味着我们将永远不会超时,但它可能意味着您将在几分钟后获得TCP超时 警告:如果主机名解析为多个IP地址,则此 客户将以RFC 3484的顺序尝试每一种。如果连接到其中的每一个 地址失败,连接前将经过多次超时 尝试抛出异常。同时支持IPv6和IPv6的主机名 IPv4始终至少有2个IP地址 我最初将自己的设置为
urlConnection.setConnectTimeout(30000)
然后将其更改为urlConnection.setConnectTimeout(1000)
。立刻,我看到了更快的结果
希望这有帮助 这可能与JDK 7中引入的错误有关。“使用保持活动缓存时,HttpServer会导致1000毫秒的延迟”。见: 根据您的目的,建议的解决方法是多线程连接HttpUrlConnection。例如,如果您使用的是HttpServer,则可以执行以下操作:
server.setExecutor( Executors.newFixedThreadPool( 5 ) );
你不是在测量你认为你在测量的东西。在调用getInputStream()或getResponseCode()之前,不会向服务器写入任何内容。所以你真的在测量:
- 连接时间
- 传输时间
- 服务器上的处理时间
原因是HttpURLConnection通过缓冲所有输出自动设置内容长度头。您可以通过使用分块传输模式来避免这种情况。然后,至少你会看到时间的真正走向。你的意思是,当你遇到连接故障时,你会看到更快的连接故障。很难看出这是如何解决OP的问题的。这很奇怪,但它是有效的!也许while循环永远在循环或者其他什么,但是对我来说这个答案非常有效!仅当他在另一端使用
HttpServer
时。没有证据证明这一点。建议的解决方法是对服务器进行多线程处理,这同样是不相关的。我们将如何做到这一点?