使片段可访问数据

时间:2014-10-06 14:13:04

标签: android android-fragments event-bus otto

我有一个应用程序正在检索主活动中的数据,并在所有碎片可用时立即向所有碎片发送事件。因此,对于第一次启动它看起来像这样:

应用程序启动(片段在后台初始化) - >饲料下载 - >发送给片段的通知 - >片段初始化UI

到目前为止,一切都很好。但是,如果我正在恢复应用程序该怎么办?数据仍将被缓存,因此我将立即在应用程序恢复时发送事件,因此可能发生我的片段甚至没有准备好接收事件 - >没有片段UI更新! 或者在片段中触发并接收事件,但片段尚未准备好进行UI更新,因为它仍然没有使布局膨胀 - >空指针异常 或者片段接收事件,但不再附加到活动 - >另一个例外。 有很多方法可以解决单个问题,但总的来说,这使得架构变得非常复杂。

不知怎的,我尝试了很多东西(玩Otto总线),但不知怎的,我找不到任何能够为应用程序中的所有活动和片段提供中央数据源的架构。

如果您不想使用捆绑包,如何为片段提供数据?

1 个答案:

答案 0 :(得分:0)

  • 首先,Fragment应独立于应用的其他部分。此外,它不应该知道父活动:getActivity方法应该只返回Activity,可以将其转换为某些interface
  • Activity不应该是“数据下载程序”。基本上activityView,它接收各种系统和用户事件并显示特定状态。例如,当系统创建活动时,它会调用方法'onCreate',其中activity应该创建/安排片段和视图。
  • 应该有一些managercontroller(根据需要调用它),它知道在哪里以及如何获取data视图。例如,如果没有互联网连接,它会从本地数据库加载数据,否则会发出网络请求。

粗略地讲流程应该是这样的:

  1. 片段(或活动)引用了DataManager。该片段在FeedDataEvent方法的onResume上订阅。当片段想要(例如onResume方法)向用户显示一些数据时,它会调用DataManager.loadFeed()并向用户显示“loading ...”
  2. DataManager检查是否有Task从网络加载数据。如果没有这么快就会启动它。
  3. 下载数据时DataManager会发出FeedDataEvent
  4. 如果片段仍然可见,则会收到该事件并显示数据。如果用户从fragment中取消订阅onStop取消订阅(使用FeedEventData方法),则不会收到该活动。
  5. 请求缓存有微妙之处(在每个onResume上发出网络请求并不是一个好主意),但这取决于特定的应用程序。

    PS几乎所有这些都在RoboSpice和其他一些库中实现。