动态片段娱乐和setRetainInstance(true)

时间:2014-05-19 19:27:17

标签: android dynamic android-fragments

我不完全了解如何重新创建活动及其片段。

想象一下以下场景:如果活动对DB的查询有一些数据,那么您有一个数据库,读取此DB的活动和一个将创建的片段。如果DB为空,则片段onCreateView将导致异常。

现在想象我们将应用程序移动到后台一段时间,活动被破坏了。此外,DB更改并变为空。

如何重建此结构? Activity开始并理解不需要片段,所以一切正常,或者片段被重新创建然后无论如何,因为它已经被创建了? setRetainInstance(true/false)会对此流程产生影响吗?

使它更复杂:我们有几个片段,其中一个决定,是否应该以类似的方式创建另一个片段。片段娱乐的顺序是什么?是某种竞争条件还是预定义的订单?

最后,我们如何防止或控制片段的重新创建?我想我有一种情况,有时片段是在正确的时间重新创建的。如何修复这样的架构?只需使用onStop()删除片段?

2 个答案:

答案 0 :(得分:0)

片段的生命周期与Activity的生命周期相关联。来自Android文档:

  

停止

     

片段不可见。主机活动已停止或片段已从活动中删除但已添加到后台堆栈。已停止的片段仍处于活动状态(系统会保留所有状态和成员信息)。但是,它不再对用户可见,并且如果活动被杀死将被杀死。

当销毁活动时,它将调用onCreate()方法重新创建活动。这意味着如果底层数据库已更改,则Activity可以决定不启动该片段。

您可以阅读有关Fragment生命周期here和活动生命周期here的更多信息。

答案 1 :(得分:0)

  

我不完全了解活动及其片段是如何发生的   重新创建。

首先,非常清楚如何在Android中使用Activity / Fragments的生命周期。在这里,我链接什么是恕我直言关于这个主题的最完整的图表(甚至比官方的更多):

http://staticfree.info/~steve/complete_android_fragment_lifecycle.svg

  

想象一下以下场景:你有一个数据库,活动阅读   如果活动的查询,将创建此DB和片段   到DB有一些数据。如果DB为空,则片段的onCreateView将为   引起异常现在假设我们将应用程序移动到了背景中   而活动被破坏了。而且,DB会改变并获得   空。

这种操作,如读取或写入数据库(或连接到Web服务或更多),都被视为I / O,应该在后台正确管理。我不知道你的具体细节,但在你的例子中,你可以使用CursorLoader。 Android文档说明如下:

  

查询ContentResolver并返回Cursor的加载器。这个   class以标准方式实现Loader协议以进行查询   游标,构建在AsyncTaskLoader上以执行游标查询   后台线程,以便它不会阻止应用程序的UI。

此外

  

如果DB为空,则片段的onCreateView将导致异常。

如果DB为空,则该片段不应导致异常(any),如果您正在使用CursorLoader,它最终将获得一个带有0个条目的Cursor。稍后(这又取决于您的实现),如果您更新数据库,您可以执行新的CursorLoader请求以获取具有新数据的刷新Cursor(如果您旋转设备,则同样适用)。

Wolfram Rittmeyer How to use Loarders Alex Lockwood

撰写的两篇很好的教程,深入讨论CursorLoader
  

活动开始并理解不需要片段,所以   一切都很好,或者无论如何重新创建片段,因为它   已经被创造了? setRetainInstance(true / false)是否有   影响这个过程?

一个活动是一个“愚蠢”的组件,它本身并不知道一个片段是什么(这不是真的,因为活动的实现知道片段)。但是为了好的缘故,这实际上取决于你尝试做什么。如果您的活动中有片段,则最终会重新创建。你必须要注意两门课程才能理解这项工作是什么:

  

最后,我们如何防止或控制片段的重新创建?一世   猜测我有一种情况,有时会重新创建一个片段   在合适的时间。如何修复这样的架构?只是   用onStop()移除片段?

不要自己搞乱生命周期事件,这是由android运行时正确管理的。