2013-10-24 70 views
1

在我的應用我下載圖像,我從一個URL獲得。這裏的問題是需要太長時間。圖像被壓縮,只有9公里大。我正在下載其中的50個,所以我們假設應用正在下載500kByte的圖片。這應該是相當快的,對吧?呃,事實並非如此。我有時候會持續20秒,直到它被加載。在那裏花了很長時間?我有一個非常簡單的方法來下載圖像。這是加速圖像下載時間

int downloadingImages = getDownloadImageCount(); 
     System.out.println(downloadingImages); 
     if(downloadingImages == 0){ 
      for(int c = downloadingImages; c < 50; c++){ 
       try{      

         bitmapArr[c]  = getBitmapFromURL(imageURLArr[c]); 
         setDownloadImageCount(50); 
         publishProgress(c); 
        } catch (FileNotFoundException f1){ 
         Log.v("FileNotFoundException", "Bitmap konnte nicht geladen werden"); 
       } catch(NullPointerException e){ 

       } catch (IllegalStateException ie){ 

       } 
       setDownloadImageCount(50); 
      } 
     } 

這是getBitmapFromUrl功能

public static Bitmap getBitmapFromURL(String src) throws FileNotFoundException { 
    try { 
     //Downloading the image 
     URL url = new URL(src); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     try{ 
      //Saving the image to a bitmap and return it 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      return myBitmap; 
      //Catch Exception if file not found 
     } catch(FileNotFoundException ffe){ 
      Log.v("FileNotFoundException", "getBitmapFromURLMethod"); 
      return null; 
     }   
     //Catch Exception if error at input and output 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

我的意思是,什麼是這麼長時間呢?我怎樣才能提高速度。稍後我會對圖像使用cahing,但仍然...我的意思是500kbs,需要很長時間。這是爲什麼?

+0

不要試圖重新發明輪子:http://square.github.io/picasso/ – Budius

+1

將一個時間戳長上幾行。這可以告訴你什麼花了太長時間。連接服務器也是一個耗時的過程。因此,確保連接建立需要時間或下載。 –

+0

您也可以使用通用的圖像加載器:https://github.com/nostra13/Android-Universal-Image-Loader –

回答

2

它採用完全自然的,它需要一段時間。對於每個像你從一個新的HTTP請求由URL加載(這是一個請求被髮送到服務器並響應)。

那50倍的往返時間在網絡上(甚至不包括時間可能需要服務器的響應)。一旦您檢索到圖像,您應該在本地緩存圖像。

0

嘗試來包裝你的InputStream的BufferedInputStream

BufferedInputStream bs = new BufferedInputStream(input); 
Bitmap myBitmap = BitmapFactory.decodeStream(input); 
2

在這個過程中最長的步驟可能向服務器發送一個請求,並等待它的迴應,你重複此步驟50次。你有能力修改服務器嗎?如果是這樣,請考慮添加一個動作,讓您一次下載所有50張圖片(也許可以將它們放入一個zip文件中,然後將其解包到客戶端)。

+0

任何想法如何做到這一點?我以前沒有聽說過這個,學習會很可愛。 – Chud37

+0

這是對解決方案的非常高級的描述。如果您正在將圖像下載到客戶端應用程序,那麼您可能擁有帶有MVC或類似架構服務器端(Ruby on Rails,Asp.NET等)的服務器 - 客戶端體系結構。您可以在服務器上創建一個新操作,使用第三方庫將圖像放入zip文件,將zip文件作爲操作結果發送,然後使用客戶端上的第三方庫來解壓縮圖像。 – Kevin