2012-11-23 21 views
6

Nella mia app sto usando un codice simile al seguente per scaricare diverse immagini. È ad alte prestazioni farlo in quel modo o posso riutilizzare la connessione in qualche modo?Riutilizzo HttpURLConnection

for(int i = 0; i < 100; i++){ 
    URL url = new URL("http://www.android.com/image" + i + ".jpg"); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      try { 
      InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
      readStream(in); 
      finally { 
      urlConnection.disconnect(); 
      } 
     } 
} 

risposta

5

Non si ottiene alcun beneficio dal riutilizzo di HttpURLConnection.

Una cosa che sarà di grande beneficio l'applicazione è se si spende un po 'di tempo guardando Async compiti, che vi permetterà di sfruttare la potenza di multi richieste HTTP filettati con callback al codice principale.

Vedere: http://www.vogella.com/articles/AndroidPerformance/article.html per un buon esempio di come le attività asincrone possono essere utilizzate.

Un buon punto di partenza è, naturalmente, il Android Developers Blog, dove hanno un esempio per scaricare un'immagine da un server in modo asincrono, che soddisferà le vostre esigenze piacevolmente. Con alcuni adattamenti, l'applicazione può inviare contemporaneamente più richieste asincrone per ottenere buone prestazioni.

L'articolo di Google è disponibile all'indirizzo: http://android-developers.blogspot.co.uk/2009/05/painless-threading.html

L'area chiave da guardare è:

public void onClick(View v) { 
    new DownloadImageTask().execute("http://example.com/image.png"); 
} 

private class DownloadImageTask extends AsyncTask { 
    protected Bitmap doInBackground(String... urls) { 
     return loadImageFromNetwork(urls[0]); 
    } 

    protected void onPostExecute(Bitmap result) { 
     mImageView.setImageBitmap(result); 
    } 
} 

Il metodo loadImageFromNetwork è dove il download avviene, e sarà completamente asincrono da il tuo thread principale dell'interfaccia utente.

Come esempio di base, è possibile modificare l'applicazione per chiamare questo modo:

for(int i = 0; i < 100; i++){ 
    new DownloadImageTask().execute("http://www.android.com/image" + i + ".jpg"); 
} 

Anche se per un'ottimizzazione, non vorrei buttare 100 richieste in una sola volta, forse la creazione di un sistema di coda filettato che consentirà forse 4 o 5 connessioni simultanee e quindi manterrà il resto in arrivo quando un altro termina mantenendo un ArrayList di richieste in sospeso da leggere.

0

Non importa come lo si fa, si finirà per aprire più connessioni, una per ottenere ogni immagine. Ecco come viene ricevuta un'immagine. E non c'è modo di cambiare il HttpURLConnection comunque. Quindi questo potrebbe sembrare buono da quel punto di vista.

Tuttavia, è possibile provare a caricare più immagini contemporaneamente tramite il threading. Sarebbe un po 'complesso implementare un simile schema, ma interamente possibile. Accelererebbe il processo richiedendo più immagini allo stesso tempo.

+2

Fa collegamento pooling dietro le quinte. – EJP