0

我有一个应用程序,它正在检索主要活动中的数据,并在它可用时立即向所有片段发送事件。所以第一次开始它看起来像这样:

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

到目前为止一切都很好。但是,如果我要恢复应用程序怎么办。数据仍将被缓存,因此我将在应用程序恢复时立即发送事件,因此可能会发生我的片段甚至还没有准备好接收事件 -> 没有片段 UI 更新!或者在片段中触发和接收事件,但片段还没有准备好进行 UI 更新,因为它还没有膨胀布局 -> NullpointerException 或者片段接收到事件,但不再附加到活动 - > 另一个例外。有很多方法可以处理单个问题,但总体而言,它使架构复杂化了很多。

不知何故,我尝试了很多东西(玩弄 Otto 总线),但不知何故,我找不到任何架构可以使中央数据源可用于应用程序中的所有活动和片段。

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

4

1 回答 1

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

所以粗略地说流程应该是这样的:

  1. 片段(或活动)引用了DataManager. FeedDataEvent片段在onResume方法中订阅。当片段想要(onResume例如方法)向用户显示一些数据时,它会调用DataManager.loadFeed()并向用户显示“正在加载...”
  2. DataManager检查是否有Task哪个正在从网络加载数据。如果没有这么快,它就会启动它。
  3. 下载数据时会DataManager发出FeedDataEvent.
  4. 如果片段仍然可见,它会接收该事件并显示数据。如果用户fragment取消订阅应用程序(在onStop方法中)FeedEventData并且不会收到该事件。

请求缓存有一些微妙的事情(对每个请求进行网络请求onResume并不是一个好主意),但这取决于特定的应用程序。

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

于 2014-10-06T14:52:15.090 回答