在活动活动/片段之间同步数据

时间:2014-04-18 19:00:48

标签: android design-patterns android-fragments synchronization communication

我必须解决一个理论问题,并希望获得有关在android中解决此问题的最佳模式/实践的反馈。

任务: 应用程序可以有多个活动/片段显示对象列表。如果一个对象同时存在于多个列表中,我希望将更改同步到此对象。所以例如如果我删除该对象,它应该在所有列表中消失。

限制是

  • 我不知道哪些列表当前已实例化
  • 每个列表都有自己的对象实例。列表之间不直接共享数据

到目前为止我的解决方案是

  • 定义一个提供数据访问方法的Storage类
  • 创建自定义Application类并使用应用程序上下文(例如内容提供者访问所需)实例化Storage类
  • Storage类定义了一个监听器,每个活动都可以自行注册
  • 如果活动修改了一个对象,它必须通过(应用程序)存储执行,则Storage类会向已注册的每个活动/片段发送一个事件,以便他们可以采用这些更改。

有谁知道更好的解决方案吗?我的解决方案是否符合android生命周期?

非常感谢各种有用的反馈

3 个答案:

答案 0 :(得分:0)

你的解决方案似乎很好。您可以使用像Otto http://square.github.io/otto/这样的EventBus在修改对象时向您的所有活动/片段发送事件。

答案 1 :(得分:0)

如果您想要处理Object,那么请阅读实现服务和绑定它们。您可以使用自己的API方法提供所有对象并返回值。如果您的数据适合数据游标模型,那么您应该阅读构建自己的ContentProvider。它内置了数据观察,所有适配器都支持它。

答案 2 :(得分:0)

如果您坚持在单独的Activity / Fragment实例中维护单独的列表,那么您将容易出现生命周期问题(当您暂停或某事时,您可能会错过对象修改事件)。 Otto或其他EventBus库可能会有所帮助。

但是,我认为在本地可绑定服务中托管所有这些列表(及其可能共享的对象)会更简单。然后,每个Activity / Fragment可以简单地在onCreate / onDestroy中绑定/解除绑定,从而保证这些列表的最新视图。

请参阅http://developer.android.com/guide/components/bound-services.html

另一个类似的解决方案是在保留的片段中托管所有这些列表。使用保留的片段比服务更简单,因为您不必编写所有绑定/解除绑定代码。但是,如果您有多个需要访问相同对象列表的Activity组件,则保留的Fragments可能无法像Service一样工作。

另一个hacky解决方案是在Application实例本身(实际上是一个全局变量)中托管所有这些东西。然后你的Activity / Fragment代码可以调用((MyApplication)getApplication())。getFooList()来获取这些对象。