2011-02-02 24 views
10

我正在考慮如何在我的Android應用中理想地實現緩存層適用於Android應用的緩存策略

目前我有通用的活動,它顯示來自遠程服務器的數據。數據由DTO TemplateInstance表示。每個模板實例都有一個包含的組件,其中每個組件都可以包含子組件。組件本身可以是文本(字符串),圖像(ByteArray)或時間(或通過子分類組件)。

目前,我的應用程序每次啓動Activity時都會從服務器加載TemplateInstance。

我現在想實現在應用一個緩存層,使得

  1. 於顯示數據的時間減少到最低限度,
  2. 數據被刷新,當它在服務器上更改。

我對這個策略是這樣的:

  • 的啓動活動由ID加載從本地存儲的模板實例(如果存在)
  • 一個UpdateService檢查中,如果模板實例背景已在服務器上更改(使用數據庫中的版本字段)
  • 如果服務器版本大於本地版本或者沒有本地TemplateInstance,則從服務器檢索數據,更新本地存儲並更新視圖

db4o的實現了這個已經成功。只是有兩個問題的解決方案:

  • db4o的是GPL下(我不能用它)
  • db4o的實在是太慢了,當我打開其中有許多圖像(4秒查詢)TemplateInstances

現在我正在尋找db4o的最佳替代品。我的想法大約是到現在爲止:

  • SQLite是因爲
  • 我不需要數據庫功能的數據結構,不適合 - 通過ID檢索對象將是足夠
  • 保持在對象當應用程序退出,所以對象可以在啓動時重新實例

你認爲什麼是最好的解決辦法內存是顯著快

  • 內存狀態應保存到磁盤爲了這?

    我對這個問題的研究把我帶到的EHCacheJCS,這是我從來沒有使用過。你認爲他們是適當的,也是在Android手機資源方面?或者你有其他建議嗎?

  • +0

    您可以從[here](https://stackoverflow.com/a/45086960/5835760)找到android應用程序的緩存實現。 – 2017-08-18 05:28:55

    回答

    4

    如果我正確理解你的情況,我認爲你應該實現你自己的緩存解決方案。我可以使用HashMap<id, TemplateInstance>。 HashMap是可序列化的,您可以分別使用ObjectOutputStreamObjectInputStream來存儲/加載它。

    +0

    謝謝!這是一個非常整潔的想法。我最終構建了一個包含多個HashMap和ArrayLists的數據結構,並使用ObjectOutputStream保存這一個緩存對象。奇蹟般有效! – Konsumierer 2011-02-03 09:43:56

    0

    你可以用我的 叉simple-disk-cache這是一個易於使用的磁盤緩存,它使用DiskLruCache

    我已經用google guava替換了Apache Commons IO依賴。並有添加新的公共方法: put(String key, String value, Object[] array) - 我用把爲最大TTL時間戳(這個時間(ms)緩存過期後)的值 和:T getArray(String key, Class type)

    你可以把陣列從這樣的序列化對象:

    cache.put("key", String.valueOf(new Date().getTime() + 60000), Groups[] arrayGroups); 
    

    ,並得到它:Groups[] cacheArray = getCacheArray("key", Groups[].class);

    你可以把緩存位圖圖像了。