在Android中实现Model-View-Presenter的困难

foe*_*ens 8 mvp android android-activity j2objc

Model-View-Presenter(MVP)是一种众所周知的GUI应用程序设计模式.对于Android,在普通Java模块中实现业务逻辑有助于测试而无需Android模拟器.

但是,由于Android应用程序GUI的特殊要求,我在Android上实现模式时遇到了困难:

  • 可以在任何时候销毁活动(来电,用户按下主页按钮,......),并且在重新创建时,它应该处于与其离开时完全相同的状态.这与大多数其他GUI应用程序不同.

  • 活动可以经历许多生命周期状态.可能会暂停,在这种情况下,不应修改活动的UI.例如,如果某些数据在后台加载,则如果它处于暂停状态,则无法将其传递给MVP(Activity)的View部分.同样,这是一个不寻常的要求.

我已经阅读了MVP for Android的博客文章并查看了示例源代码.我试图通过使用MVP模式实现的最终目标是能够使用转换器j2objc将所有业务逻辑转换为Objective-C ,这样在iOS上实现相同的应用程序时可以重用业务逻辑.

有没有人成功实现了Android的MVP模式,在这种情况下,我错过了什么?

小智 4

我建议在不涉及 Activity 的情况下实现 MVP 组件,也许从概念上考虑什么对 Android 和 GWT 都有用。使用测试驱动开发和模拟视图界面创建组件,添加测试直到业务逻辑完全实现和验证。TDD 有助于保持组件 API 的精简(为什么要为不需要的东西编写测试?),这使得组件的移植变得更加容易。

您描述的活动要求可以概括为与平台无关:组件应该是可序列化的(小's',而不是特定的Java序列化),并且需要接受生命周期状态事件。这些也可以使用系统功能的模拟进行全面测试。当您完成此步骤时,您可能会注意到很少有 Activity 要求一定是 Android 特定的,并且可能在其他平台上有用。避免创建庞大的服务API;例如,要支持序列化,所需的只是存储/加载方法,而不是像Parcel API之类的东西。我发现在白板上向其他开发人员描述此类服务 API 是发现不必要的废话的好方法。

接下来,将组件移植到 Android,可能是通过创建一个委托给组件的 Activity 并为模拟接口提供 Android 特定的实现类。它应该第一次就“正常工作”,但实际上,可能会遗漏一些要求,因此将它们添加到与平台无关的部分并重复。

当您准备好移植到 iOS 时,重新实现那些以前模拟的接口。如果这些接口很精简,那么直接在 Objective-C 中创建它们可能会更容易,导入 j2objc 生成的协议头。例如,j2objc 的NSDictionaryMap类使用 NSDictionary 实现来实现 java.util.Map —— 无需编写和翻译 Java 版本,因为它只使用 iOS API。