Java HttpURLConnection随机延迟

Java HttpURLConnection随机延迟,java,android,httpurlconnection,Java,Android,Httpurlconnection,当我使用UploadHelper时,我注意到在随机基础上有一个~1.1-1.3s的小延迟。所以这不是第二个请求,可能是第一个,也可能是第四个请求。 有时,它工作完美,没有任何明显的延迟。在以下位置调用c.getInputStream时似乎会出现延迟:BufferedReader br=new BufferedReadernew InputStreamReaderc.getInputStream 有没有人在我的课堂上看到一个奇怪的行为,或者是这个问题的更好的解决方案?已经尝试将超时设置从10.00

当我使用UploadHelper时,我注意到在随机基础上有一个~1.1-1.3s的小延迟。所以这不是第二个请求,可能是第一个,也可能是第四个请求。 有时,它工作完美,没有任何明显的延迟。在以下位置调用c.getInputStream时似乎会出现延迟:BufferedReader br=new BufferedReadernew InputStreamReaderc.getInputStream

有没有人在我的课堂上看到一个奇怪的行为,或者是这个问题的更好的解决方案?已经尝试将超时设置从10.000ms更改为1.000ms,这解决了同样的问题,延迟更大。平均延迟为3秒,当我将超时更改为1000时,延迟最大为1.3秒

我的班级:

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的真正停止播放的问题。但作为一种替代方案,这当然值得尝试。如果能添加一些背景知识和解释,解释一下为什么这可能会解决问题,这个答案就会有所改进。