Android MVP-屏幕方向-保留演示者状态

Android MVP-屏幕方向-保留演示者状态,android,retrofit,mvp,mosby,Android,Retrofit,Mvp,Mosby,我有一个关于Android中MVP模式的问题。我想写我自己的“应用程序核心”,它将有演示者,视图等基类。它必须简单,干净和“稳定”。我的想法与莫斯比的想法非常相似,我正在努力实现以下目标: 每个活动都有自己的演示者,视图(界面 要与“活动”进行通信,查看状态 保存持久数据) 当活动被销毁时: 分离视图 将ViewState保存在捆绑包中 取消演示者中的所有后台任务(完成时更新视图的任务) 销毁演示者 重新创建活动时: 附加视图 恢复视图状态 创建演示者的新实例 重新启动已取消的后台任务

我有一个关于Android中MVP模式的问题。我想写我自己的“应用程序核心”,它将有演示者,视图等基类。它必须简单,干净和“稳定”。我的想法与莫斯比的想法非常相似,我正在努力实现以下目标:

  • 每个活动都有自己的演示者视图(界面 要与“活动”进行通信,查看状态 保存持久数据)
  • 活动被销毁时:

    • 分离视图
    • 将ViewState保存在捆绑包中
    • 取消演示者中的所有后台任务(完成时更新视图的任务)
    • 销毁演示者
  • 重新创建活动时:

    • 附加视图
    • 恢复视图状态
    • 创建演示者的新实例
    • 重新启动已取消的后台任务
  • 除了最后一个问题——“重新启动已取消的后台任务”,我几乎完成了所有的事情。用一个例子来讨论它会更容易。假设我在演示者中有两种方法(改装2个调用):

    • downloadUsers()-从web服务器和onSuccess Update视图获取用户数据
    • downloadProject()-从web服务器获取项目信息,并在“成功更新”视图中查看
    现在,当其中一个调用已启动但尚未完成时,用户正在更改配置当重新创建演示者时,我如何知道应该重新启动哪一个演示者?

    我唯一想到的是为每个任务创建一个持久布尔标志,在任务开始时设置为true,在任务完成时设置为false。创建演示者时,我将检查每个标志并重新启动相应的调用


    你觉得怎么样?如何改进?还有其他想法吗?

    我不知道您的UI是什么样子,但我觉得您应该将一个大视图拆分为两个子视图:

    • DownloadUsersView
      +视图状态由
      DownloadUsersPresenter
    • DownloadProjectsView
      +视图状态由
      downloadprojectspresecenter管理
    在我看来,MVP只有一个模型可以显示在视图中(而不是像您的场景中那样有两个),这一直是一个好主意。通常,如果必须在同一视图中处理两个模型,则可以将此视图和演示者拆分为两个不同的视图

    或者,您可以将两个模型合并为一个模型,如下所示:

    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或任何您喜欢的东西)。