我在Fragment生命周期中遇到麻烦,需要解决方案

时间:2018-08-31 14:08:11

标签: android fragment lifecycle

我对此进行了充分的研究,没有一个明确的解决方案。

在生命周期中,尤其是在Fragment生命周期中,在onPause()之后的任何时刻都会出现Exception。

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

我的逻辑说,要继续当前的片段,当它到达此状态后,我必须重新启动活动,并使用Intent再次指向想要的片段。

我想弄清楚正在发生的事情以及应对它的真正解决方案。

我需要了解这种机制的优缺点;在片段或活动生命周期中的重要性。

此外,如果我将onCreate中的Windows功能更改为不进入睡眠状态,除非用户手动按了“主页”按钮,否则活动仍将进入此状态吗?

2 个答案:

答案 0 :(得分:3)

当您试图在Fragment内的Activity暂停时以任何其他方式添加/删除/替换/交互时,会发生此异常。

这意味着Activity如果立即被销毁,将无法恢复其状态(恢复已更改的Fragment的状态)。

此处的最佳解决方案是在与Fragment交互期间检查Activity是否不暂停。 另一种选择是使用commitAllowingStateLoss()与Fragment事务进行交互,但可能会丢失其状态。

请参阅: https://developer.android.com/reference/android/app/FragmentTransaction.html#commitAllowingStateLoss()

在理想环境中,您应该仔细分析每个崩溃,并添加检查以验证是否只有在Activity启动并运行时才与片段进行交互。

答案 1 :(得分:1)

在新的Android开发人员参考和使用JetPack生命周期监听器的指南文档中提供了更好的解释。

https://developer.android.com/topic/libraries/architecture/lifecycle#kotlin

该库使组件知道活动生命周期。这意味着您不需要覆盖每个生命周期回调的抽象baseActivity类,并将该状态记录在布尔变量中。 LifeCycle侦听器将为您做到这一点。

所有您需要做的就是停止引入新的片段,或者停止在响应返回时更新UI的所有Loader。正确的时间是在调用onStop或onSavedInstance状态之前,您的组件将被意识到。

它清楚地表明,在调用onSavedInstancState或onStop之后,UI变为不可变的,直到再次调用Activity的onStart为止。有时,当此状态发生并且没有机会调用onStart时,您必须使用intent使用NEW TASK和CLEAR TASK标志调用重新启动同一活动。

快乐编码:-)