2013-05-28 24 views
2

什么是通知执行一些后台处理的片段的托管活动的重建方法,它完成了什么。假设碎片正在运行一些正在主循环之外工作的线程。在片段中通知处理信息的活动

一个简单的回调不会做,因为:

  • 的活动可以被分离,由于屏幕旋转,这将导致到一个NullPointerException。
  • 来自活动内部的投票只是愚蠢的
  • 只附加调用该活动一次,并让每个onCreate调用后(即由于屏幕旋转)检查活动。
  • 我目前的工作,但它似乎是错误的:每当片段被连接,它会检查工作是否完成,并通过回调通知活动。如果片段完成工作,它也会回调活动(如果附加)。

为什么我认为是错的?因为我有一些非常难看的方法来检查片段是否被连接,并且如果工作完成以便可能调用回调。当在片段中执行一些工作期间引发异常并且活动被分离时,这变得非常愚蠢。如果android决定在同一时刻调用onSaveInstance,则必须将该Exception放入Bundle中,并在Activity和fragment从保存状态重新创建时稍后传递。此外,我可以遇到这样一种情况,即一次活动将收到两次相同的回调(一次是检查碎片,另一次是碎片被连接;这可能会在应用程序保存并恢复时发生)

这会生成在我的选择中,许多代码可能会更清楚,如果活动不会分离。这就是为什么我希望我做错了什么,希望有人能为我提供更好的解决方案。

+0

尽管我不知道你到底想要实现什么。也许您的答案是将服务实现为“您的主要活动”,这样可以确保您的服务始终处于运行状态,并且您可以随时通过服务通知服务,从片段完成某些工作。 – Mario

+0

片段运行时间为5秒。我不想为每一个做一些背景工作的片段都提供服务。 – Chris

+0

您不需要为每个片段提供服务,而只需要每个片段通知的服务。 – Mario

回答

2

我会说你应该使用一个服务为你的后台处理,但如果你选择了一个特定的原因片段,你可以坚持下去。您应该通过一个BroadcastReceiver来通知活动来自可能与活动有不同生命周期的片段或服务。使用这种方法,活动可以在其自己的生命周期回调期间通过registerunregister BroadcastReceiver。从片段或服务你只是send the broadcast,并忘记它。如果一个活动正在监听广播,它将收到它,如果不是什么都不会发生。

+0

我忘记了广播系统。重组我的代码后,我总是同意你的看法。我之所以没有使用它,是因为我以一种使用广播的方式组织了我的片段,使用起来非常痛苦。谢谢 – Chris