使用Wifi的Android上的HttpClient导致延迟(在初始请求时)

时间:2011-04-26 18:29:08

标签: android https wifi httpclient delay

我在Android上遇到HttpClient这个奇怪的问题。如果我尝试使用WiFi连接到https网址,我会在发送实际请求之前有延迟。如果我通过3G发送请求,则延迟不存在。

然而,它只发生在Android 2.2和2.3上,如果我在例如2.1-update1上运行它也可以在wifi上运行。

但是,在初始请求之后立即发送请求时 - 它也可以在Wifi上正常工作 - 但只有一段时间。然后它回到10秒,一个,然后再适当一段时间......

在2.3上运行时: 11285 ms

在1.6上: 617毫秒

我用来尝试解决这个问题的代码是这样的 HttpManager和:

public class Main extends Activity {

Button button;
TextView text;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            doRequest();
        }

    });
}

private void doRequest() {
    HttpGet httpget = new HttpGet("https://url_goes_here/");

    HttpResponse httpResponse = null;
    try {
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        long before = System.currentTimeMillis();
        httpResponse = HttpManager.execute(httpget);
        long after = System.currentTimeMillis();

        HttpEntity entity = httpResponse.getEntity();
        String response = convertStreamToString(entity.getContent());
        Log.i("Test", response);

        TextView text = (TextView) findViewById(R.id.text);
        text.setText((String) "Time: " + (after-before) + "\n" + response);

    } catch (Exception e) {
        e.printStackTrace();
        // Simplified code a bit
    }
}

protected static String convertStreamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

发生延迟的行是HttpManager.execute(httpget);这也是我计算ms的行。

有没有人遇到过这个问题?我发现这种延迟非常烦人,我的用户也是如此。仿真器的运行方式与运行2.1-update1的Xperia Mini Pro的运行方式相同,它可以通过Wifi正常工作,而运行CyanogenMod 7(2.3)的HTC Desire则无法正常工作。

2 个答案:

答案 0 :(得分:1)

android附带的ssl堆栈存在问题。我也在努力解决这个问题。转到apache home,获取org.apache.http java包(我使用的是v4.1)。在您的应用程序中包含它并直接使用HttpClient,而不是使用Android内置的HttpClient,您的SSL握手延迟问题将得到解决。

答案 1 :(得分:0)

禁用路由器上的DNS中继!它对我有用!

此外,没有版本的httpclient或httpcore为我改变了它。