2010-08-21 50 views
18

我目前在應用程序的cache子目錄中有我的應用程序緩存圖像文件。這些圖像用於ListView並存儲在SoftReferencesBitmapsHashMap中。在Android中緩存文件時的最佳做法

所以我的問題是,什麼是緩存這些圖像文件,無需誇大我的應用程序使用並保持從用戶的角度來看響應空間的最佳方式。

事情我很擔心:

我知道用戶可以清除緩存,當空間不足的內部存儲器是自動完成的,但我覺得大多數用戶將看到一個幾MB的應用程序,並卸載。此外,如果空間不斷減少,我的應用程序將繼續下載圖像,使其顯得較慢。

大多數設備都預裝了SD卡,但未插入時該怎麼辦?與內部存儲相比,SD卡速度可能會更慢,從而影響我應用的性能。

我應該包含一個選項來選擇緩存的位置嗎?

我應該試圖控制我的緩存的大小(無論是在/緩存或/ SD卡)或只是忘了呢?

謝謝你的時間(我知道的時間很長),並請張貼任何相關的經驗。

回答

15

我不能爲您提供一套全面的最佳實踐,但我可以提供我所學會爲止:

管理緩存是一個好主意。我的應用程序的緩存是這樣的,我知道我永遠不會需要超過一定數量的緩存文件,所以無論何時將新文件插入緩存中,我都會刪除最早的文件,直到我處於設置的限制範圍內。你可以根據尺寸做類似的事情,或者簡單的年齡。

緩存到SD卡上,如果它是可用的,如果是你的緩存需要佔用大量的空間是一個好主意。您需要小心地管理該空間,因爲它不會自動爲您清除該空間。如果您正在緩存圖像文件,請務必將它們放在以點開頭的目錄中,如「/yourAppHere/.cache」。這將使圖像不再出現在畫廊中,這真的很煩人。

讓用戶選擇高速緩存的位置似乎有點小題大做給我,但如果你的聽衆是很令人討厭,或許可以理解。

緩存到SD的時候我都沒有注意到一個多大的懲罰,但我不知道你的應用如何使用這些信息。

+0

我喜歡你的想法,防止畫廊看到圖像。畫廊在什麼條件下將它們撿起來?我還沒有看到隨機圖片,我知道我的手機上有一些應用程序像twidroid緩存它們。 – smith324 2010-08-23 18:41:47

+1

@ chris324看看http://developer.android.com/guide/topics/data/data-storage.html#filesExternal,標題爲'Saving files that should be shared' – Eric 2010-08-23 22:07:58

+0

@Eric感謝您的鏈接,看起來像一個名爲'.nomedia'的空文件的外部目錄將被mediascanner忽略。 它看起來像getExternalCacheDir()在2.2中是新的,這將是有用的。 – smith324 2010-08-23 23:04:51

2

每個人都有很好的想法。我喜歡使用SoftReference的想法,儘管我不確定這些清理的頻率有多高,因爲從VM到VM的差異很大。您可能希望將其與常規的HashMap結合使用,以防止整個緩存每隔幾分鐘就會被清除。

的EclipseLink有幾個不同的緩存實現和pretty good documentation on them。您可能會利用實現中的一些想法(例如,LRU,MRU等)。例如,

  • 硬盤緩存
  • 軟高速緩存
  • 結合軟/硬緩存

既然你調整高速緩存下降到基本事實,我會推薦它調整到不同的設備基於硬規格。這通常是不好的設計,但你的軟件運行的硬件的範圍要求它,恕我直言。例如

  • 檢測SD卡上的可用內存量。大多數新款智能手機都配備了多GB的SD卡,而這些卡很難滿足大多數用戶的日常使用需求。消失!您還可以在啓動時檢測SD卡上的可用空間量,並在啓動時增加/減少緩存的大小。
  • 檢測可用內存的數量並配置您的高速緩存。如果用戶使用硬件密集型應用程序,我不認爲它會佔用200MB內存,並提供非常快速的用戶體驗,尤其是因爲他們花費了大量資金購買了一款擁有1 -2GB內存。

祝你好運!

+0

有趣的閱讀。我喜歡使用組合硬/軟參考緩存的概念。但是,根據可用堆精細調整緩存大小看起來好像對我來說太過殺戮,尤其是因爲虛擬機會爲每個手機提供相同的數量。 – smith324 2010-08-26 16:21:59

+0

在Android下使用SoftReferences時要非常小心。 Android系統會盡快清除它們,即使這不是Java標準提出的行爲。而不是Softreferences使用LRU緩存,該緩存僅限於可用內存的一小部分。 http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html – Janusz 2012-07-09 11:14:20

0

我應該包含一個選項來選擇緩存的位置嗎?

IMO:不,我們使它更簡單越好(除了可以包括專家用戶提前設定)

我應該試圖控制我的緩存的大小(無論是在/緩存 或/ SD卡)或只是忘了它?

IMO:這是可選的,它是雙刃劍:你的背景更多的工作將幫助用戶更方便也更錯誤容易發生

使用第三個庫: IMO使用3庫作爲畢加索更好的是,它通過命令自動處理緩存:內存緩存 - >磁盤緩存 - >網絡