我正在尝试在我的应用程序中实现 MVP 架构。
但是,在阅读了一些博客并查看了一些示例项目示例之后,我不确定我是否完全理解分离视图的正确位置,以及在异步操作后第二次附加视图后应该做什么。
我看到的大多数示例,都只是在异步调用之后用视图的 null 验证检查来总结。
我将尝试通过一个示例来说明我的观点 - 通过电话号码登录/注册(主要思想是重要的事情,而不是示例本身)
有一个显示片段的活动 - LoginFragment。
用户输入他的电话号码并尝试登录。
如果用户退出 - 他应该被导航到另一个活动(在输入短信接收到的代码之后..)
如果用户没有退出,他应该被导航到注册过程 - RegistrationFragment。
如果出现错误,应该会出现一个带有错误消息的对话框ErrorDialogFragment。
现在,在一个快乐的流程中,用户按下登录按钮并等待该过程完成,一切都很好。
但是,在一个不太愉快的流程中(不是那么频繁,但绝对不能被忽略),用户按下登录按钮,然后按下主页按钮或者接听电话。
在场景1中,我们在 onCreate/onDestroy 中附加/分离视图,一旦异步登录操作完成,我们应该替换为RegistrationFragment或显示ErrorDialogFragment,我们有可能会遇到著名的 IllegalStateException:
getting exception "IllegalStateException: Can not在 onSaveInstanceState 之后执行此操作”
在场景2中,我们在 onResume/onPause 中附加/分离视图,一旦异步登录操作完成,我们将无法替换片段或显示对话框,因为视图已经分离。
在这种情况下,我不确定什么是正确的做法。
我们是否应该使用场景 1 并使用commitallowingstateloss提交事务?
恐怕这是个坏主意。
或者我们应该使用场景 2。在这种情况下,我们应该在再次附加视图时采取相应的行动,这意味着在 Presenter/Interactor 中保存状态(RegistrationRequied、ErrorHasOccured、LoginProcessStillRunning 等)。
有人可以对此有所了解吗?
提前致谢!