2013-07-25 67 views
0

我從數據庫中加載了大約10個位圖,但它可能會在未來更多。從URL加載位圖太慢

這需要總共約3秒鐘,我想改善,因爲用戶需要等待加載完成。 (裝載在AsyncTask發生)

這裏是我的代碼:

Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 

這是一個循環,我從數據庫加載JSONArray內,包括該圖像(網址是有效的,直接鏈接到圖片)。

我記錄了加載所有內容所需的毫秒數,一次迭代大約350ms,但大約300ms只是轉換。

有什麼辦法可以改善嗎?像每次不創建新的位圖對象一樣?

+0

位圖?通過網絡?使用壓縮圖像。 – m0skit0

+0

我無法控制圖像或輸入。 –

+0

使用延遲加載 – KOTIOS

回答

1

爲什麼不添加緩存功能?加載圖像時,您將首先嚐試從緩存中加載它。如果圖像在那裏,你應該立即擁有它。

我使用兼容包中的LRUCache

除此之外,從數據庫加載圖像始終是時間和資源消耗。您必須先查找,獲取數據,然後執行解碼。根據持久的數據類型和圖像的大小,有這些延遲是正常的。出於這個原因,爲什麼不將圖像保存在SD卡上或應用程序文件結構中的任何位置?我正在使用DiskLRUCache

編輯:我現在注意到您的圖像的來源是網絡服務。這甚至更好:構建一個雙層緩存:內存緩存和磁盤緩存。

因此獲得的圖像會做:

  1. 檢查,如果圖像是記憶:是的,你有它瞬間。
  2. 檢查SD卡/應用程序文件結構中的圖像:是的,你幾乎立即擁有它
  3. 從網絡下載圖像。但即使在這裏,如果您有權訪問該服務,也可以進行一些改進。在服務器端使用API​​來根據需要調整圖像大小。在服務器端緩存這些調整大小的圖像。這樣你就可以優化下載速度和客戶端應用內存。或者,如果您無法訪問該服務,請構建您自己的代理服務,以實現此即時調整大小,然後調用該服務。
+0

有超過一百張圖片,我只需要其中的一些 - 但我下次加載圖片時可能需要不同的圖片。但緩存看起來可能是一種改進 –

+0

好吧,'LRU'代表「最近最少使用」。這意味着您使用圖片的次數越多,您從存儲下載/加載的次數就越少。注意你如何設置'LRUCache'。給它一個最大內存使用率的百分比。 – gunar

+0

爲我的答案增加了更多建議。 – gunar

0

您的問題是每個連接都是由它自己處理,這意味着每個圖像創建一個新的TCP連接獲取數據,然後再次關閉連接。

您可以嘗試使用線程一次加載多個圖像。在創建連接時大部分時間都會丟失,並且您將序列化您每次都要等待的請求。如果使用線程,則可以減少圖像加載的完成時間,因爲連接創建是並行化的。

另一種選擇是使用專用的HTTP客戶端庫。這可以更好地處理連接,因爲它們只打開一次TCP連接,然後通過此單連接發送多個請求。然後TCP連接的開銷只有一次。

+0

你可以發佈一個示例/鏈接加載線程的例子而不關閉連接嗎? –

+0

@BenjaminSchwalb閱讀關於線程化的教程(例如[here](http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html))。 –

+0

線程本身不是問題,只是沒有每次打開連接的部分 - 「BitmapFactory.decodeStream(url.openConnection()。getInputStream()'在這裏我明確地打開連接 - 我將如何更改此? –