HttpClient на Android с использованием Wi-Fi вызывает задержку (по первому запросу) - PullRequest
2 голосов
/ 26 апреля 2011

У меня странная проблема с HttpClient на Android. Если я пытаюсь подключиться к URL-адресу https через Wi-Fi, у меня возникает задержка перед отправкой фактического запроса. Если я отправлю запрос через 3G, задержки не будет.

Тем не менее, это происходит только на Android 2.2 и 2.3. Если я запустил его, например, на 2.1-update1, он также отлично работает на Wi-Fi.

Тем не менее, при отправке запросов сразу после первоначального запроса - он работает правильно и на Wifi - но только на некоторое время. Затем возвращается 10 секунд, а потом снова ненадолго ...

При работе на 2.3: 11285 мс

и на 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); это также строка, по которой я вычисляю мс.

Кто-нибудь когда-нибудь сталкивался с этой проблемой? Я нахожу эту задержку очень раздражающей, как и мои пользователи. Эмуляторы работают так же, как Xperia Mini Pro с 2.1-update1, где он работает должным образом по Wi-Fi, и HTC Desire с CyanogenMod 7 (2.3), где он не работает должным образом.

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Существует проблема со стеком ssl, включенным в Android.Я тоже боролся с этим.Перейдите в дом apache и получите java-пакет org.apache.http (я использовал v4.1).Включите это в свое приложение и используйте HttpClient непосредственно из него вместо использования HttpClient, встроенного в Android, и ваша проблема с задержкой рукопожатия SSL будет решена.

0 голосов
/ 17 июня 2011

Отключите DNS Relay на вашем роутере!Это просто сработало для меня!

Кроме того, ни одна версия httpclient или httpcore не изменила его для меня.

...