gpt4 book ai didi

Android MVP - 分离 View (onPause VS onDestroy)和状态保存

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:17 25 4
gpt4 key购买 nike

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

但是,在阅读了一些博客并查看了一些示例项目示例之后,我不确定我是否完全理解分离 View 的正确位置在哪里,以及 View 第二次附加后应该做什么 在异步操作之后。

我看到的大多数例子,只是在异步调用后用 View 的空验证检查来总结。

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

有一个显示 fragment 的 Activity - LoginFragment
用户输入他的电话号码并尝试登录。
如果用户退出 - 他应该被导航到另一个 Activity (在输入短信收到的代码后..)
如果用户没有退出,他应该被导航到注册过程 - RegistrationFragment
如果出现错误,将出现一个包含错误消息的对话框,ErrorDialogFragment

现在,在用户按下登录按钮并等待过程完成的快乐流程中,一切都很好。

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

在场景 1 中,我们在 onCreate/onDestroy 中附加/分离 View ,一旦异步登录操作完成,我们应该替换为 RegistrationFragment 或显示 ErrorDialogFragment,我们有可能会遇到著名的 IllegalStateException:
getting exception "IllegalStateException: Can not perform this action after onSaveInstanceState"

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

在这种情况下,我不确定该怎么做才是正确的。
我们是否应该使用场景 1 并使用 commitallowingstateloss 提交事务?
恐怕这是个坏主意。

或者我们应该采用场景 2。在这种场景中,我们应该在再次附加 View 时采取相应的行动,这意味着在 Presenter/Interactor 中保存状态(RegistrationRequied、ErrorHasOccured、LoginProcessStillRunning 等)。

有人可以就此阐明一些信息吗?

提前致谢!

最佳答案

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

根据我的个人经验,诉诸 commitAllowingStateLoss 通常是尝试在后台更新 Ui( View )的症状(正如您所注意到的,ui 可能会被破坏)。

我建议您不要在不检查 Activity 是否已后台运行(onStop 或 onPause 视情况而定)的情况下尝试更新您的用户界面。如果您的用户界面已后台运行,请记住您需要进行的更改,并在您的用户界面重新连接时执行这些更改(onStart 或 onResume 视情况而定)。

本质上我是说您应该遵循场景 2。是的。您将不得不以某种方式保存相当多的状态。

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

但是,我有一篇我前段时间写的博客文章,介绍了一种不需要额外库的方法。

现在有点过时了,但它可能会给你一些想法:A Simple MVP aproach for Android

祝一切顺利

亲切的问候,克里斯。

关于Android MVP - 分离 View (onPause VS onDestroy)和状态保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46985061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com