3

我正在尝试在我的应用程序中实现 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 等)。

有人可以对此有所了解吗?

提前致谢!

4

1 回答 1

4

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

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

我的建议是,您不要在不检查活动是否已在后台运行(onStop 或 onPause 取决于具体情况)的情况下尝试更新您的 ui。如果您的 ui 已被后台处理,请记住您需要进行的更改,并在您的 Ui 重新连接时进行更改(onStart 或 onResume 取决于具体情况)。

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

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

但是,我前段时间写了一篇博客文章,介绍了一种不需要额外库的方式来做到这一点。

现在有点过时了,但它可能会给你一些想法:适用于 Android 的简单 MVP 方法

一切顺利。

亲切的问候,克里斯。

于 2017-10-28T01:32:18.347 回答