2010-05-03 64 views
4

我有一個應用程序從互聯網獲取數據,爲了獲得更好的性能和帶寬,我需要實現一個緩存層。如何緩存和存儲對象並在android中設置過期策略?

有兩種不同的數據來自互聯網,一種是每隔一小時更換一次,另一種基本不會改變。因此,對於第一類數據,我需要實施一項過期策略,以便在創建1小時後將其自行刪除,並且當用戶請求該數據時,我會首先檢查存儲空間,然後在沒有找到任何內容的情況下轉到Internet。

我想過使用SharedPrefrence或SQLDatabase來存儲json數據或序列化對象字符串。

我的問題是:

1)我應該使用什麼,SharedPrefrence或SQLDatabase或其他任何東西,一塊數據並不大,但也有可能是數據的多個實例。

2)如何實現該過期系統。

回答

2

我會使用SQLite進行存儲+在Application子類中使用last invalidated timestamp
它將在每次數據訪問調用時與System.currentTimeMillis()進行比較,以決定是否應提取新的集合。爲此擁有一個瘦代理層。

0

您可以使用HTTP HEAD方法檢查服務器上的修改日期,看看您是否確實需要獲取新數據。每次應用程序啓動時,並在運行時間間隔內,查詢服務器以查看數據是否已更改。這假定數據緩存在服務器上,並且不會在每個請求上動態生成,也不依賴於哪個客戶端發出請求。

因此,您需要存儲每個項目的數據和日期。如果數據是一個長度適中的字符串,並且少於幾千字節的總數,SharedPreferences就足夠了。如果數據長度存在已知上限,則使用數據庫,否則可以使用純文件。 SharedPreferences每次提交時都會寫入一個xml文件。

您可以創建一個具有長睡眠間隔的線程來執行定期檢查,或者創建一個Handler並使用postDelayed或類似的方法產生一個檢查線程。根據陳舊數據的最大值檢查項目。如果每10分鐘檢查一次,則允許最多10分鐘的舊數據,平均爲一半。無論如何,在啓動時檢查會使事情在大多數情況下顯示最新。

如果所有項目都一次過期,那麼您只需檢查一個項目的日期以知道它們應該全部刷新。如果沒有,你可以嘗試使用條件GET而不是檢查每個項目的HEAD。

+0

我儘量避免HTTP調用。 – yanchenko 2010-05-03 03:30:44

+0

一旦你決定要打服務器,你仍然可以通過查看數據是否真的改變來節省一些帶寬。 – drawnonward 2010-05-03 18:28:05