【问题标题】:Synchronizing data between active activities / fragments在活动活动/片段之间同步数据
【发布时间】:2014-04-18 19:00:48
【问题描述】:

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

任务: 一个应用程序可以有多个显示对象列表的活动/片段。如果一个对象同时出现在多个列表中,我想同步对该对象的更改。所以例如如果我删除该对象,它应该会在所有列表中消失。

限制是

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

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

  • 定义一个提供数据访问方法的存储类
  • 创建一个自定义应用程序类并使用应用程序上下文实例化存储类(例如内容提供程序访问所需要的)
  • Storage 类定义了一个 Listener,每个活动都可以在其中注册自己
  • 如果一个活动修改了一个对象,它必须通过(应用程序)存储来完成,存储类会向每个注册的活动/片段发送一个事件,以便它们可以采用更改。

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

非常感谢各种有用的反馈

【问题讨论】:

  • developer.android.com/reference/android/content/… ContentProviders 应该会提供您寻求的答案。
  • 感谢您的提示。正如@dangVarmit 已经提到的,我可以向内容解析器注册一个侦听器以获取有关更改的通知。但是,它没有为我提供正在更改的实际对象。当我正在寻找最优雅/最简单的解决方案时,将我的方法与 Otto 一起用作 EventBus 会更好吗?

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


【解决方案1】:

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

【讨论】:

  • 感谢您的提示。正如我所见,您可以注册一个 ContentObserver 以获得通知。但是,你不知道哪些对象被修改了,所以你必须重新读入整个数据,对吧?
  • 不,你不知道。这看起来很奇怪,但是对于游标,无论如何您都必须再次发出整个查询才能获取新数据,因此确切知道哪个项目发生了变化并没有那么重要。
【解决方案2】:

您的解决方案似乎不错。当对象被修改时,您可以使用像 Otto http://square.github.io/otto/ 这样的 EventBus 将事件发送到您的所有活动/片段。

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多