Android MVP-屏幕方向-保留演示者状态
我有一个关于Android中MVP模式的问题。我想写我自己的“应用程序核心”,它将有演示者,视图等基类。它必须简单,干净和“稳定”。我的想法与莫斯比的想法非常相似,我正在努力实现以下目标:Android MVP-屏幕方向-保留演示者状态,android,retrofit,mvp,mosby,Android,Retrofit,Mvp,Mosby,我有一个关于Android中MVP模式的问题。我想写我自己的“应用程序核心”,它将有演示者,视图等基类。它必须简单,干净和“稳定”。我的想法与莫斯比的想法非常相似,我正在努力实现以下目标: 每个活动都有自己的演示者,视图(界面 要与“活动”进行通信,查看状态 保存持久数据) 当活动被销毁时: 分离视图 将ViewState保存在捆绑包中 取消演示者中的所有后台任务(完成时更新视图的任务) 销毁演示者 重新创建活动时: 附加视图 恢复视图状态 创建演示者的新实例 重新启动已取消的后台任务
- 分离视图
- 将ViewState保存在捆绑包中
- 取消演示者中的所有后台任务(完成时更新视图的任务)
- 销毁演示者
- 附加视图
- 恢复视图状态
- 创建演示者的新实例
- 重新启动已取消的后台任务
- downloadUsers()-从web服务器和onSuccess Update视图获取用户数据
- downloadProject()-从web服务器获取项目信息,并在“成功更新”视图中查看
你觉得怎么样?如何改进?还有其他想法吗?我不知道您的UI是什么样子,但我觉得您应该将一个大视图拆分为两个子视图:
+视图状态由DownloadUsersView
DownloadUsersPresenter
+视图状态由DownloadProjectsView
downloadprojectspresecenter管理
class DownloadModel {
List<User> users;
List<Project> projects;
}
类下载模型{
列出用户名单;
列出项目清单;
}
然后将两个改装调用组合起来创建一个DownloadModel
,两个调用完成后,您可以在视图中显示DownloadModel
。对于改型和rxjava,这非常简单(请参见combineTest()
operator)。在这种情况下,您不会遇到这个问题,因为您的演示者只有一个download()
方法可以并行下载这两个方法。如果其中一个比另一个快得多,那么很可能在方向更改和重新创建演示者后,速度更快的一个来自改装缓存,因此这不会给您带来太多麻烦
正如您已经说过的,您还可以开始在presenter中跟踪之前执行的http调用,并在presenter重新实例化后重新调用它们,但这意味着presenter必须将其内部状态保存到bundle中。莫斯比没有对此做出任何说明,并假设一般来说没有这种需要。因此,Mosby的默认Presenter实现不提供Presenter.saveInstanceState(Bundle)
和Presenter.restoreInstanceState(Bundle)
。但这并不意味着你不能/不应该那样做。您可以在Mosby和您的实现中这样做。但是,如果您开始这样做,那么您只需将活动类中先前的意大利面代码(没有mvp)移动到presenter中
因此,我再次强烈建议在MVP中每个视图使用一个模型
顺便说一句,为什么要重新发明轮子?听起来莫斯比已经提供了你想要的东西。Mosby还支持保留在屏幕方向更改后仍能保留的演示者。有许多方法和解决方案。我喜欢使用LoadersAPI。这是一个简单的库,您可以使用它来持久化演示者实例的跨方向更改 谢谢你的全面回答。我这样做主要是为了教育目的——我想玩泛型,了解android生命周期,并学习如何避免内存泄漏:)我想将演示者的状态包含到VIewState中,并在一个包中保存所有和恢复。但现在我知道这是个坏主意。意大利面条的味道很好。我同意演示者应该只处理一个模型。我在上面的例子中选择了一些不幸的名字。让我们将其更改为:downloadUsers()-reformation调用;storeUsers()-将下载的数据保存到数据库中。我是否也应该使用Rx?rafakob找到解决方案?您的问题是,您将MVP视为异步后台任务调度的所有解决方案。MVP的主要目的是将视图和模型分离,并让一个演示者作为“协调员”坐在两者之间。在您的示例中:最好在自己的android服务中执行storeUser()
,因为您不想在屏幕上重新执行storeUser()
,对吗?因此,在服务中执行storeUser()
,让演示者观察服务(eventbus、rxjava或任何您喜欢的东西)。