Android MVP-分离视图(onPause VS onDestroy)和状态保留

Android MVP-分离视图(onPause VS onDestroy)和状态保留,android,mvp,android-mvp,Android,Mvp,Android Mvp,我正在尝试在我的应用程序中实现MVP架构 但是,在阅读了一些博客并查看了一些示例项目示例后,我不确定自己是否完全理解分离视图的正确位置,以及在异步操作后,视图第二次连接后应该做什么 我看到的大多数示例都是在异步调用后通过视图的null验证检查来总结的 我将用一个例子来说明我的观点-通过电话号码登录/注册(主要思想是重要的,而不是示例本身) 有一个显示片段的活动-LoginFragment 用户输入他的电话号码并尝试登录。 如果用户退出-他应该被导航到另一个活动(输入sms接收到的代码后) 如果用

我正在尝试在我的应用程序中实现MVP架构

但是,在阅读了一些博客并查看了一些示例项目示例后,我不确定自己是否完全理解分离视图的正确位置,以及在异步操作后,视图第二次连接后应该做什么

我看到的大多数示例都是在异步调用后通过视图的null验证检查来总结的

我将用一个例子来说明我的观点-通过电话号码登录/注册(主要思想是重要的,而不是示例本身)

有一个显示片段的活动-LoginFragment
用户输入他的电话号码并尝试登录。
如果用户退出-他应该被导航到另一个活动(输入sms接收到的代码后)
如果用户没有退出,他应该被导航到注册过程-RegistrationFragment
如果出现错误,则应显示带有错误消息的对话框,ErrorDialogFragment

现在,在一个愉快的流程中,用户按下登录按钮并等待流程完成,一切正常

但是,在一个不太快乐的流程中(不太频繁,但绝对不能被忽略),用户按下登录按钮,然后按下主页按钮,或者接到一个电话

在场景1中,我们在onCreate/onDestroy中附加/分离视图,一旦异步登录操作完成,我们应该替换为RegistrationFragment或showErrorDialogFragment,我们就有可能遇到著名的非法状态异常:

在场景2中,我们在onResume/onPause中附加/分离视图,一旦异步登录操作完成,我们将无法替换片段或显示对话框,因为视图已经分离

在这种情况下,我不确定该怎么做。
我们是否应该继续场景1并提交带有CommitteAllowingStateLoss的交易?
恐怕这是个坏主意

或者我们应该使用场景2。在这种情况下,当视图再次附加时,我们应该采取相应的行动,这意味着在演示者/交互者中保存状态(RegistrationRequired、ErrorHasOccursed、LoginProcessStillRunning等)

有人能解释一下吗


提前谢谢

哦,安卓生命周期的乐趣。我感觉到你的痛苦

根据我个人的经验,使用commitAllowingStateLoss通常是试图在后台更新Ui(视图)的症状(正如您所注意到的,Ui可能会被破坏)

我的建议是,如果不检查活动是否已被背景化(取决于具体情况,是在停止还是暂停),就不要尝试更新ui。如果您的用户界面已经建立在后台,请记住您需要进行的更改,并在重新连接用户界面时进行更改(根据具体情况进行启动或恢复)

本质上,我是说你应该遵循场景2。是的。你必须以某种方式保存相当多的状态。

不幸的是,这并不容易,有很多方法可以做到这一点,从使用事件总线一直到使用RxJava。 每种方法都有它的优点和缺点,它们都太复杂了,无法在一篇文章中详细讨论

然而,我有一篇我不久前写的博客文章,是关于一种不需要额外库的方式来实现这一点的

现在有点过时了,但它可能会给你一些想法:

祝你一切顺利

亲切问候,, 克里斯