2012-08-25 78 views
1

我正在使用Jake Wharton's DiskLruCache lib。使用DiskLRUCache的Android照片/縮略圖策略

我很好奇應用性能,緩存策略,在視圖和整個應用中使用緩存。大多數時候,圖像不會改變。

比方說,例如我的服務器上有一張320x320照片。我打開流,保存圖像。

  1. 在我的列表視圖中,我顯示了位圖並在詳細信息中顯示了更大的圖像。我是否也應該保存縮略圖位圖?更高效嗎?

  2. 什麼是整個應用程序(比方說我有可能利用相同的數據。什麼是與此問題的多個視圖共享緩存「對象」你的經驗?

  3. 爲求性能和貨幣,如果圖像在服務器上發生變化,怎麼辦?知道它發生了變化的最佳策略是什麼?我沒有修改日期的權限,只有大小,但我並不想每次查詢大小。在服務器上的應用程序設置一個標誌,然後查詢標誌?

    1. 在傳統的應用程序(如果有這樣的事情),不時清理緩存的最佳做法是什麼? (縮進weirded出來。)

(我的靈感來自於iOS的看到所有的性能改進被Facebook後寫這個,我沒有數十億做緩存,但我想至少大笑)

回答

3

很多這些答案取決於你正在寫的應用程序類型,圖像更新有多重要(以及圖像可能發生改變的可能性等)以及產生的總圖像。除了磁盤緩存之外,還應該使用內存緩存,特別是在ListView和其他重複滾動相同圖像的區域中。查看LruCache並閱讀Google的Caching Bitmaps條目。

320x320對於listview來說可能太大了,您可能想要創建縮略圖(取決於設備以及如何實現您的列表視圖)。

1)您應該相當積極地使用磁盤緩存(您如何定義這取決於您正在編寫的應用程序)。使用外部存儲目錄,如果他們剩下幾GB,如果您的應用需要100 MB,則不是問題。無論如何,它都可以被清除掉。

2)應該沒有問題。磁盤IO(即使是閃存介質)永遠不應該在主線程上處理。使用AsyncTasks加載圖像。無論如何,一次只能有一個主要的前臺活動,而一個活動正在休眠時,它不應該試圖從磁盤讀取數據。

3)這又取決於你如何實現你的應用程序。在檢索文件時,您應該能夠獲得更多信息(即使Apache可以告訴您的應用程序最近一次修改日期)。 3.1)您可以擁有一個sqllite db,用於跟蹤特定圖像的使用頻率以及最近一次讀取的頻率。如果最近的閱讀時間過去了幾天,讓該圖像過期。

編輯:有來自沃頓商學院的傑克圖書館現在叫畢加索,我會建議使用,它處理網絡/本地IO以及內存和磁盤緩存。檢查它在這裏:http://square.github.io/picasso/Picasso.with(this).load(imageFileURL).into(imageView);

:很多的,你需要做什麼可以用一條線來完成