我正在尝试在我的应用中实现MVP架构。
然而,在阅读了一些博客并查看了一些示例项目示例后,我不确定我是否完全理解在哪里找到合适的视图分区,以及在第二次附加视图后应该怎么做执行异步操作后。
我看到的大多数例子都是在异步调用之后用视图的空验证检查来总结它。
我会尝试用一个例子来说明我的观点 - 通过电话号码登录/注册(主要想法是重要的,而不是示例本身)
有一个显示片段的活动 - LoginFragment
用户输入他的电话号码并尝试登录
如果用户退出 - 他应该导航到另一个活动(输入短信收到的代码后......)
如果用户没有退出,他应该导航到注册过程 - RegistrationFragment 。
如果出现错误,则会出现带有错误消息的对话框, ErrorDialogFragment 。
现在,在一个愉快的流程中,用户按下登录按钮并等待流程完成,一切顺利。
但是,在一个不太快乐的流程中(不是那么频繁,但绝对不能被忽略),用户按下登录按钮,然后按下主页按钮或者接听电话。
在方案 1 中,我们在onCreate / onDestroy中附加/分离视图,一旦异步登录操作完成,我们应该替换为 RegistrationFragment 或显示 ErrorDialogFragment ,我们有可能遇到着名的IllegalStateException:
getting exception "IllegalStateException: Can not perform this action after onSaveInstanceState"
在方案 2 中,我们在onResume / onPause中附加/分离视图,一旦异步登录操作完成,我们将无法替换片段或显示对话框,因为视图已经分离。
在这种情况下,我不确定做什么是正确的。
我们应该使用方案1并使用 commitallowingstateloss 提交交易吗?
我担心这是个坏主意。
或者我们应该使用方案2.在这种情况下,我们应该在再次查看视图时采取相应的行动,这意味着在Presenter / Interactor中保存状态(RegistrationRequied,ErrorHasOccured,LoginProcessStillRunning等等。)
有人可以对此有所了解吗?
提前致谢!
答案 0 :(得分:4)
哦Android生命周期的乐趣。我感觉到你的痛苦。
根据我的个人经验,使用commitAllowingStateLoss通常是在后台尝试更新Ui(View)的一种症状(正如您所注意到的,ui可能会被破坏)。
我建议您不要尝试更新您的ui而不检查活动是否已经落后(onStop或onPause,具体取决于具体情况)。如果您的ui已经背景,请记住您需要进行的更改,并在重新连接Ui时执行这些更改(onStart或onResume,具体取决于具体情况)。
本质上,我说你应该遵循场景2.是的。你将不得不以某种方式保存相当多的状态。
不幸的是,这并不容易,并且有许多方法可以实现这一点,从使用事件总线到使用RxJava。 每种方法都有它的优点和缺点,它们都太复杂了,无法在一篇文章中详细讨论。
但是,我之前写过一篇博文,其中介绍了一种不需要额外库的方式。
现在有点过时,但它可能会给你一些想法:A Simple MVP aproach for Android
一切顺利。
亲切的问候, 克里斯。