Существует ли более быстрый способ загрузить страницу от сети до строки?

Я попробовал другие методы для загрузки информации с 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());
}
5
задан egrunin 16 June 2010 в 06:06
поделиться

3 ответа

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


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

2
ответ дан 15 December 2019 в 06:16
поделиться

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

0
ответ дан 15 December 2019 в 06:16
поделиться

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

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);
} 
1
ответ дан 15 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: