Java HttpURLConnection随机延迟
当我使用UploadHelper时,我注意到在随机基础上有一个~1.1-1.3s的小延迟。所以这不是第二个请求,可能是第一个,也可能是第四个请求。 有时,它工作完美,没有任何明显的延迟。在以下位置调用c.getInputStream时似乎会出现延迟:BufferedReader br=new BufferedReadernew InputStreamReaderc.getInputStream 有没有人在我的课堂上看到一个奇怪的行为,或者是这个问题的更好的解决方案?已经尝试将超时设置从10.000ms更改为1.000ms,这解决了同样的问题,延迟更大。平均延迟为3秒,当我将超时更改为1000时,延迟最大为1.3秒 我的班级:Java HttpURLConnection随机延迟,java,android,httpurlconnection,Java,Android,Httpurlconnection,当我使用UploadHelper时,我注意到在随机基础上有一个~1.1-1.3s的小延迟。所以这不是第二个请求,可能是第一个,也可能是第四个请求。 有时,它工作完美,没有任何明显的延迟。在以下位置调用c.getInputStream时似乎会出现延迟:BufferedReader br=new BufferedReadernew InputStreamReaderc.getInputStream 有没有人在我的课堂上看到一个奇怪的行为,或者是这个问题的更好的解决方案?已经尝试将超时设置从10.00
public class MyUploadHelper {
private static final int timeout = 1000;
private static final String API_SERVER = "http://domain.nl/json/";
private static final String TAG = "MyUploadHelper";
public MyUploadHelper(){
}
public <T> T upload(Class<T> a, String url, Map<String, String> paramMap) throws Exception {
HttpURLConnection c = null;
try {
URL u = new URL(API_SERVER + url);
c = (HttpURLConnection) u.openConnection();
// c.setRequestProperty("Content-length", "0");
c.setUseCaches(false);
c.setAllowUserInteraction(false);
// c.setConnectTimeout(timeout);
c.setReadTimeout(timeout);
c.setDoOutput(true);
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (String key : paramMap.keySet() ) {
String value = paramMap.get( key );
params.add(new BasicNameValuePair(key, value));
}
OutputStream os = c.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(prepareParams(params));
writer.flush();
writer.close();
c.connect();
int status = c.getResponseCode();
Log.d(TAG, "Server API URL: " + u.toString() + ", ResponseCode:" + String.valueOf(status));
switch (status) {
case 200:
case 201:
Gson gson = new Gson();
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
return gson.fromJson(br, a);
}
} catch (IOException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
} finally{
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
}
return null;
}
private String prepareParams(List<NameValuePair> params) throws UnsupportedEncodingException
{
StringBuilder result = new StringBuilder();
boolean first = true;
for (NameValuePair pair : params)
{
if (first)
first = false;
else
result.append("&");
result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
}
return result.toString();
}
}
试装
c.setConnectTimeout(1000);
我不确定这是您的问题的原因,但您可以做一些事情来帮助HTTP客户端维护连接,即提供您数据的内容长度。在打开OutputStream调用prepareParams之前,请使用utf-8编码将其转换为字节数组,然后使用字节数组的大小设置内容长度。然后将字节数组直接发送到输出流,而不使用缓冲写入器。我不确定在流写入之后是否需要c.connect方法。写入流将导致它无论如何都要连接,并且可能会删除disconnect方法。在使用HttpURLConnectionHmm时,我从未使用过它。我尝试过你的建议,但似乎没有改善延迟。也不会变得更糟。这是服务器端的问题吗?justsayinJakarta commons HttpClient是一个常用的客户端。不过,我从来没有遇到过任何关于HttpURLConnection的真正停止播放的问题。但作为一种替代方案,这当然值得尝试。如果能添加一些背景知识和解释,解释一下为什么这可能会解决问题,这个答案就会有所改进。