Есть ли более быстрый способ загрузки страницы из сети в строку? - PullRequest
5 голосов
/ 16 июня 2010

Я пробовал другие способы загрузки информации с URL, но мне нужен более быстрый. Мне нужно скачать и проанализировать около 250 отдельных страниц, и я хотел бы, чтобы приложение не выглядело смехотворно медленным. Это код, который я в настоящее время использую для извлечения одной страницы, любая информация была бы полезной.

try 
{
    URL myURL = new URL("http://www.google.com");
    URLConnection ucon = myURL.openConnection();
    InputStream inputStream = ucon.getInputStream();
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
    ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(50);
    int current = 0;
    while ((current = bufferedInputStream.read()) != -1) {
        byteArrayBuffer.append((byte) current);
    }
    tempString = new String(byteArrayBuffer.toByteArray());

} 
catch (Exception e) 
{
    Log.i("Error",e.toString());
}

Ответы [ 3 ]

2 голосов
/ 16 июня 2010

Старайтесь держать соединение открытым, если запросы поступают на один и тот же сервер.Кроме того, старайтесь избегать перераспределений в буфере и читайте как можно больше за один раз.


const int APPROX_MAX_PAGE_SIZE = 300;
try 
{
    URL myURL = new URL("http://www.google.com");
    URLConnection ucon = myURL.openConnection();
    ucon.setRequestHeader("Connection", "keep-alive") // (1)
    InputStream inputStream = ucon.getInputStream();
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
    ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(APPROX_MAX_PAGE_SIZE); // (2)
    int current = 0;
    byte[] buf = new byte[APPROX_MAX_PAGE_SIZE];
    int read;
    do {
       read = bufferedInputStream.read(buf, 0, buf.length); // (3)
       if(read > 0) byteArrayBuffer.append(buf, 0, read);
    } while (read >= 0);
    tempString = new String(byteArrayBuffer.toByteArray());

} 
catch (Exception e) 
{
    Log.i("Error",e.toString());
}


  1. Установите заголовок Keep-alive (не уверен, что вам это нужно, на J2SE этонастраиваемое свойство)
  2. Выделите то, что «обычно достаточно» в буфере, чтобы избежать перераспределения.
  3. Читайте более одного байта одновременно

Отказ от ответственности: Этобыл написан "в шторке" без доступа к компилятору Java.Может случиться так, что setRequestHeader доступен только для HttpURLConnection (приведение необходимо) или что некоторые параметры неверны, но вы можете редактировать, если это так.

1 голос
/ 16 июня 2010

Почему бы вам не использовать встроенные компоненты Apache http?

HttpClient httpClient = new DefaultHttpClient();
HttpGet request = new  HttpGet(uri);
HttpResponse response = httpClient.execute(request);

int status = response.getStatusLine().getStatusCode();

if (status != HttpStatus.SC_OK) {
    ByteArrayOutputStream ostream = new ByteArrayOutputStream();
    response.getEntity().writeTo(ostream);
} 
0 голосов
/ 16 июня 2010

Используйте объединенный HTTPClient и попытайтесь сделать 2 или 3 запроса одновременно.И попробуйте создать пул памяти, чтобы избежать выделений и остановок GC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...