Android MVP-分离视图(onPause VS onDestroy)和状态保存
作者:互联网
我正在尝试在我的应用程序中实现MVP架构.
但是,在阅读了一些博客并查看了一些示例项目示例之后,我不确定我是否完全了解分离视图的正确位置以及在异步操作后第二次附加视图后应该怎么做.
我看到的大多数示例都只是在异步调用后对视图的null验证检查进行了总结.
我将通过一个示例来阐明我的观点-通过电话号码登录/注册(主要思想是重要,而不是示例本身)
有一个显示片段的活动-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.在这种情况下,当再次附加视图时,我们应该采取相应的措施,这意味着将状态(RegistrationRequied,ErrorHasOccured,LoginProcessStillRunning等)保存在Presenter / Interactor中.
有人可以对此有所启示吗?
提前致谢!
解决方法:
哦,Android生命周期的乐趣.我感到你很痛苦.
以我的个人经验,诉诸commitAllowingStateLoss通常是在后台更新Ui(视图)的症状(如您所述,UI可能会被破坏).
我的建议是,您不要在未检查活动是否已后台的情况下尝试更新ui(视情况而定,onStop或onPause).如果您的用户界面已经有背景,请记住您需要进行的更改,并在重新连接您的用户界面时进行(根据情况,选择onStart或onResume).
本质上,我是说您应该遵循方案2.是的.您将不得不以某种方式保存很多状态.
不幸的是,这并不容易,从使用事件总线一直到使用RxJava,有很多方法可以做到这一点.
每种方法都有其优点和缺点,它们实在太复杂了,无法在单个文章中进行详细讨论.
但是,我有一段博客文章是我前一段时间写的,它不需要额外的库就可以做到这一点.
现在有点过时了,但可能会给您一些想法:A Simple MVP aproach for Android
祝一切顺利.
亲切的问候,
克里斯.
标签:mvp,android-mvp,android 来源: https://codeday.me/bug/20191025/1929788.html