1

我必須解決一個理論問題,只想獲得有關在android中解決此問題的最佳模式/練習的反饋。在活動活動/片段之間同步數據

任務: 應用程序可能有幾個活動/片段顯示對象列表。如果一個對象同時出現在多個列表中,我想同步對這個對象的更改。所以例如如果我刪除對象,它應該在所有列表中消失。

的限制是

  • 我不知道是哪個名單當前實例
  • 每個列表都有它自己的對象實例。數據未列出之間直接共享

我的解決方案至今將

  • 定義存儲類,它提供了數據訪問
  • 創建一個自定義應用程序類和實例存儲類方法(例如內容提供者訪問所需的)
  • Storage類定義了一個Listener,其中每個活動都可以註冊自己
  • 如果活動修改了一個活動對象,它必須通過(應用程序)存儲來完成,Storage類將事件發送到每個註冊的活動/片段,以便他們可以採用這些更改。

有沒有人知道更好的解決方案呢?我的解決方案是否符合android生命週期?

非常感謝每一種有用的反饋

+1

http://developer.android.com/reference/android/content/ContentProvider.html ContentProviders應該提供您尋求的答案。 – DeeV

+0

感謝您的提示。正如@dangVarmit已經提到的,我可以向內容解析器註冊一個監聽器,以獲得有關更改的通知。但是,它沒有爲我提供正在更改的實際對象。當我在尋找最優雅/最簡單的解決方案時,使用Otto作爲EventBus的方法會更好嗎? – user1033552

回答

0

如果您想要在Object中進行交易,請閱讀有關實現Services和Binding的內容。您可以使用自己的API方法提供所有對象並返回值。如果您的數據適合數據光標模型,那麼您應該閱讀構建您自己的ContentProvider。它內置了數據觀察功能,所有適配器都支持它。

+0

感謝您的提示。正如我所看到的,您可以註冊一個ContentObserver來獲得通知。但是,您不知道哪些對象已被修改,因此您必須重新讀入整個數據,對嗎? – user1033552

+0

不,你不知道。這看起來很奇怪,但是使用遊標,您將不得不再次發出整個查詢以獲取新數據,因此與確切知道哪個項目發生更改無關。 – dangVarmit

0

如果你堅持在單獨的Activity/Fragment實例中維護單獨的列表,那麼你將很容易出現生命週期問題(你可能會在你暫停或某事時錯過對象修改事件)。 Otto或其他EventBus庫可能會有所幫助。

但是,我認爲在本地可綁定服務中託管所有這些列表(及其可能共享的對象)要簡單得多。然後每個Activity/Fragment可以在onCreate/onDestroy中簡單地綁定/解除綁定,從而保證了這些列表的最新視圖。

參見http://developer.android.com/guide/components/bound-services.html

另一個類似的解決方案將是主機在一個片段保留所有這些列表。使用保留的碎片將比服務更簡單,因爲您不必編寫所有的綁定/解除綁定代碼。但是,如果您有多個活動組件需要訪問相同的對象列表,則保留的碎片可能無法像服務一樣運行。

還有一個拙劣的解決方案就是將所有這些東西託管在應用程序實例本身(實際上是一個全局變量)中。然後你的Activity/Fragment代碼可以調用((MyApplication)getApplication())。getFooList()來獲得這些對象。