2012-01-27 49 views
2

我有一個ListView其中每個單元格包含從互聯網下載的位圖。爲了避免內存不足錯誤,我想知道處理這個問題的最好方法是什麼。緩存位圖 - Android

我已經看過位圖的softreferences,但我想知道如果我在當前的活動和應用程序開始用盡內存會發生什麼。它如何決定要回收的位圖?

將文件寫入磁盤並在需要時將其加載到內存中是一種更好的方法嗎?有沒有例子?

感謝

+0

檢查此鏈接http://stackoverflow.com/questions/1919679/android-listiem-recycle-while-scroll-up-or-down和這一個也許雖然它是關閉http://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-images-in-listview – 2012-01-27 17:01:03

回答

7

我剛剛處理了一段時間。也用性能進行實驗。這是我得到的。
此答案超出lazy loading of images,因爲它涉及性能。

首先:在android上忘記SoftReferences。由於行爲不當(很快就會發布)對緩存非常不利。我結束了使用LruCachesource for API < 12)的緩存的固定字節大小。

當通過網絡加載圖片時,您希望持久加載的圖片(在私人應用程序數據文件夾或SD卡中)。否則,用戶將被迫在每次應用啓動時加載(不必要的)數據。這裏的例行:

  1. 圖像請求
  2. 支票圖像在內存緩存(跳轉到6如果可用)
  3. 的(如果是的話跳到5)堅持本地網絡從
  4. 負荷和從緩存中堅持
  5. 負載位圖入高速緩存
  6. 負載位圖到圖

現在說一些表現的話。如果每個列表項目都有另一個圖像並且它們具有固定大小(例如40 x 40 dip),那麼當加載完整圖像時(例如800 x 600 px),您將浪費高速緩存內存,並且設備必須計算大量縮放比例。

第一種解決方案是在將圖像加載到緩存之前在步驟5.上對位圖進行預分頻。持續縮放圖像並在下次加載時,您將獲得最佳性能。

您可以在我的CoverCache助手(CD封面 - 但可用於任何類型的圖像數據)中找到示例。它同時處理持續,縮放和緩存圖像。

1

有很多實現與圖像的延遲加載與通過convertView mecanism意見重用列表視圖的。例如,看看這裏:Lazy load of images in ListView

這裏有很多解決方案。

+0

我已經是懶加載圖像,但問題是如何處理情況時,有太多的圖像,因爲手機會收到一個內存不足的例外。滾動應該不會強制回收位圖,因爲那樣它將不得不重新下載它,這將提供不良的用戶體驗 – mirugai 2012-01-27 17:09:38

+0

您是否也在使用convertview? – Yahel 2012-01-27 17:46:04