2012-11-23 101 views
6

在我的應用程序中,我使用下面的代碼來下載幾個圖像。 這樣做是否高性能?或者我可以以某種方式重新使用連接嗎?重複使用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(); 
      } 
     } 
} 

回答

5

重複使用HttpURLConnection並不會真正獲得任何好處。

一兩件事,這將大大有利於你的應用程序是,如果你花一些時間尋找到異步任務,這將允許您利用與回調多線程的HTTP請求的力量,你的主代碼。

請參閱: http://www.vogella.com/articles/AndroidPerformance/article.html 瞭解如何使用異步任務的一個很好的例子。

一個很好的起點雖然當然是Android開發者博客,他們有一個例子從服務器異步下載圖像,這將很好地滿足您的要求。通過一些適應,您可以讓應用程序一次發送多個異步請求,以獲得良好的性能。

的谷歌的文章,可以發現在: http://android-developers.blogspot.co.uk/2009/05/painless-threading.html

的關鍵區域看,就是:

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); 
    } 
} 

loadImageFromNetwork方法就是下載發生,並且將完全異步遠離你的主UI線程。

作爲一個基本的例子,你可以修改你的應用程序來調用這個像這樣:

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

雖然一個優化,我不會扔100只請求了一次,也許創建一個線程隊列系統將允許可能有4或5個併發連接,然後通過維持掛起的請求的ArrayList讀取結束時其餘部分通過。

0

不管你怎麼做,你最終會打開多個連接,一個來獲取每個圖像。這是如何收到任何圖像。無論如何,無法改變HttpURLConnection。所以從這個意義上來看,這看起來很好。

但是,您可以嘗試通過線程同時加載多個圖像。實施這樣的方案會有些複雜,但完全有可能。它將通過同時請求多個圖像來加速該過程。

+2

它在幕後做連接池。 – EJP