2010-06-16 18 views
5

Ho provato altri metodi per scaricare informazioni da un URL, ma avevo bisogno di uno più veloce. Devo scaricare e analizzare circa 250 pagine separate e vorrei che l'app non sembrasse ridicolmente lenta. Questo è il codice che sto attualmente usando per recuperare una singola pagina, qualsiasi intuizione sarebbe ottima.C'è un modo più veloce per scaricare una pagina dalla rete in una stringa?

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()); 
} 
+0

250 pagine? Stai costruendo una sorta di database? –

risposta

2

Provare a mantenere la connessione aperta se le richieste si riferiscono allo stesso server. Inoltre, cerca di evitare riallocazioni nel buffer e di leggere il più possibile in un colpo solo.

 

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. Set intestazione keep-alive (non so se avete bisogno di questo, su J2SE è una proprietà configurabile pure)
  2. Assegnare ciò che è "abbastanza solitamente" nel buffer per evitare di riallocazione.
  3. leggere più di un byte alla volta

responsabilità: questo è stato scritto "in cieco" senza accesso a un compilatore Java. È possibile che setRequestHeader sia disponibile solo su HttpURLConnection (necessario cast) o che alcuni parametri siano errati, ma ti preghiamo di modificarlo in caso affermativo.

+0

Sono tutti sullo stesso server, suggerimenti sul codice? – cphil5

+1

Qualcosa come ucon.setRequestHeader ("Connessione", "keep-alive") Il riutilizzo della connessione viene gestito internamente. Inoltre, prova a leggere il buffer in blocchi, non byte per byte. – Krumelur

+0

Il codice sopra ha funzionato con una leggera modifica, sto andando a segnarlo contro la vecchia routine e ti faccio sapere. BTW I analizza una pagina di circa 75K per ottenere l'URI 250 per analizzare le singole pagine. – cphil5

1

Perché non si utilizzano i componenti http Apache integrati?

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

IMHO, URLConnection è più di alto livello dell'interfaccia con il protocollo HTTP direttamente. – Krumelur

+0

Questi errori su HttpClient.execute (richiesta); "Impossibile eseguire un riferimento statico al metodo non statico eseguito (HttpUriRequest) dal tipo HttpClient" – cphil5

+0

Il metodo di esecuzione in org.apache.http.client.HttpClient non è statico. Ho aggiornato l'esempio precedente per includere la creazione di HttpClient. – Schildmeijer

0

Utilizzare un pool HTTPClient e cercare di fare 2 o 3 richieste in una sola volta. E prova a creare un pool di memoria per evitare allocazioni e le bancarelle GC.

Problemi correlati