android - 多个 Activity/Fragments 和 Model View Presenter 模式

标签 android android-fragments android-activity design-patterns mvp

首先,我知道 Model View Presenter 有不同的实现方式,在我看来,只要您明确定义了抽象层并履行指定的职责,那么您如何实现此模式就有待解释。我已经在很多只有一个 Activity 的应用程序中实现了这种模式。我现在开始了一个新项目,它有多个 Activity 并附加了 Fragments,包括嵌套 fragment (ViewPager)。

我现在正在尝试将 MVP 转化为这个项目,但我遇到了概念障碍,想要一些指导和见解。

到目前为止,我已经创建了上述结构并开始与 View & Presenter 建立 1 : 1 的关系(无论是 Activity 还是 Fragment)。我觉得这没问题,但是,例如,如果我从 Activity View 向其 Presenter 发送了执行某项操作的请求,Presenter 将结果返回给 Activity View 会如何我着手传播结果,即更新当前不处于 Paused()Stop() 状态的所有其他 Activity/fragment 。我觉得在这种情况下应该有一个中央 Presenter 来更新所有必要的 Activity 和 Fragment Views,但我不确定如何去做。

目前,当创建每个 ActivityFragment 时,它会创建一个 Presenter 类的新实例,将自身作为引用传递(Activity 和 Fragment 实现它们自己的接口(interface)),演示者将其存储为 WeakReference,并可以在返回结果时调用相关接口(interface)方法。

根据文档,每当 Fragments 想要相互通信以及附加的 Activity 时,您应该使用回调接口(interface)。考虑到这一点,我应该有一个 Activity 实现的回调接口(interface)和 Fragments 每当他们请求某些东西时回调,所以本质上只有 Activity 会有一个 Presenter 和 Model 层,Fragments 必须回调为了提出各种要求?

抱歉,如果这听起来有点困惑,希望这足够清楚以理解我想要实现的目标,如果我的思路是正确的......或者完全偏离目标!

最佳答案

我认为在 Activity 中有演示者是可以的。基本上 Activity 就像一个 Controller ,它应该知道演示者。

如果 Activity 或其他 Fragment 也需要它,那么将 Presenter 放在 Fragment 中是错误的。仅当演示者是专门为 fragment 设计的时,才可以将演示者放入 fragment 中。

which the presenter stores as a WeakReference and can invoke the relevant interface methods when returning a result

为什么这里需要一个WeakReference?如果您有 1:1 关系,那么我假设您的演示者没有自己的生命周期,这意味着它的生命周期取决于 Activity 或 fragment 。没有内存泄漏的风险,因为它不是单例,对吧?有强引用应该是安全的。

我不确定我是否回答了您的问题,因为它看起来有点宽泛。我的观点是, fragment 只是 Activity 的分离“部分”,您应该将它们视为部分。如果presenter只属于这部分,那么它应该在里面。否则它应该处于 Activity 状态。关于使用 interface 访问 Activity,您是正确的,这是 Google 在其示例中使用的一种众所周知的设计方法。

关于android - 多个 Activity/Fragments 和 Model View Presenter 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35804197/

相关文章:

android - 将 Fragment 中的 Parcelable 对象共享到 Activity

java - 如何将 fragment 添加到没有 ID 的 View 中?

android-activity - 显示来自 android.app.application 的对话框

java - 如何在android中获取连接到同一网络的设备的mac地址?

android - 可以在xml中设置setDisplayShowTitleEnabled来为ActionBar设置主题吗?

javascript - Phonegap Android 在输入焦点 Javascript 上显示键盘

android - 如何让溢出的 TextView 与 android :ellipsize ="start"? 一起使用

android - 从后台堆栈中删除 fragment

android - 单元测试 Android Fragment 时 ClassCastException onAttach()

android - 无法阻止 Activity 在屏幕旋转时重新启动