2012-05-08 4 views
1

Мне нужно сделать около 15 вызовов для различных веб-сервисов (php) при запуске приложения.Http Post и сетевая задержка

Я использую следующий код для поста

public static String post(String url, List<BasicNameValuePair> 
      postvalues, HttpClient httpclient) { 
    try { 
     if (httpclient == null) { 
      httpclient = new DefaultHttpClient(); 
     } 
     HttpPost httppost = new HttpPost(url); 

     if ((postvalues == null)) { 
      postvalues = new ArrayList<BasicNameValuePair>(); 
     } 
     httppost.setEntity(new UrlEncodedFormEntity(postvalues, "UTF-8")); 

     // Execute HTTP Post Request 
     HttpResponse response = httpclient.execute(httppost); 
     return requestToString(response); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 

} 



private static String requestToString(HttpResponse response) { 
    String result = ""; 
    try { 
     InputStream in = response.getEntity().getContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     StringBuilder str = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      str.append(line + "\n"); 
     } 
     in.close(); 
     result = str.toString(); 
    } catch (Exception ex) { 
     result = "Error"; 
    } 
    return result; 
} 

Проблема заключается в том, что некоторые из ходатайств должны быть запрошены в заданном порядке, и каждый запрос занимает около 1-2 секунды так что «Загрузка всплеск «занимает около 10 секунд.

Так что мой вопрос: так как все подключения относятся к одному и тому же серверу, как я могу улучшить эту задержку? Есть ли способ открыть соединение и отправить все петиции через этот «туннель», уменьшающий задержку?

ПРИМЕЧАНИЕ: Я проверил код и запросы взять то же самое время повторного использования HttpClient с использованием нового в каждом соединении

Благодаря

+0

Если вы не можете распараллелить звонки, то вам нужно найти узкие места, и удалить их. Мы не можем сказать вам, где они находятся; вы должны измерить. Это сетевой ввод-вывод? Является ли веб-служба PHP самой медленной? Почему вы не можете использовать «лучший» веб-сервис, который не требует так много индивидуальных вызовов? –

+0

Вы также контролируете реализацию сервера? Затем вы можете объединить службы по одному (или нескольким) запросам. Кроме того, является ли время ответа 1-2 секунды неотъемлемой медлительностью службы или латентностью сети? – jhonkola

+1

Я предлагаю вам заменить свой метод 'requestToString()' на EntityUtils.toString (response.getEntity()) - он меньше кода, имеет лучшую обработку ошибок и фактически подчиняется кодировке символов, отправленной сервером. –

ответ

2

Что вы имеете в виду это HTTP постоянное соединение, которое повторно использует TCP подключение.

Об этой теме есть уже хороший вопрос & ответить здесь на Stackoverflow:

Persistent HttpURLConnections on Android

Смежные вопросы