11

问题:非常大且复杂的 Activity 类。难以阅读/理解和修改。很难测试。

可能的解决方案:Model-View-Presenter(可能使用依赖注入)。和模拟测试对象!

我计划在我的 Android 应用程序中实现 Model-View-Presenter。这基本上是模型-视图-控制器的变体。本质上,让 Activity 成为一个美化的布局管理器,并将任何业务逻辑交给 Presenter。查看 Presenter 的另一种方式是,它就像在 Activity 中实例化的 Helper 类,通过提供 Presenter 可以使用的接口/回调的 Activity 来完成繁重的工作。

我想了解一些社区对此的看法。例如: this 隐含了哪些接口?
Model 和 View 与 Presenter 相比有什么责任。

对于 Presenter,我想 Activity 会实现 Presenter 所需的接口吗?
Presenter vs. Activity 应该包含哪些内容?

演示者会与活动一对一吗?如果一个 Activity 有多个显示不同小部件的片段,每个片段都有自己的适配器呢?我们现在需要多个演示者还是仍然只需要一个?

Presenter vs. Adapter 怎么样?

演示者应该如何关联说具有 ListView 和 ListViewAdapter 的 Activity?Presenter 与 Adapter 有什么关系?
Presenter 应该选择要使用的适配器吗?还是应该由 Activity 做出这个决定?Presenter 应该处理模型数据还是适配器?适配器和演示者之间是否存在冲突?适配器是演示者吗?或更少/更多的东西。通常适配器仅适用于 Activity 中的 ListViews 等小部件。我认为他们不会拨打获取数据本身的电话。

所以在模型-视图-展示器中,关键是真正决定展示器与其他类的内容以及展示器与活动、适配器和视图/包括片段之间的通信应该是什么。

Model-View-Presenter 对 Android 来说真的是个坏主意吗?或者它是否适合 Android 框架?

请记住,在 Android 之外还有许多非常成熟的 SDK 的示例,它们仍然需要像 MVP 这样的微架构。事实上例子比比皆是:例如。Flex 是非常成熟的 Flash SDK,但它仍然需要几乎所有主要应用程序的 MVP 和 MVC 框架。

EJB 需要 Spring 来简化和组织它。MFC/Struts 等,不胜枚举。为什么Android应该有所不同?为什么我们要假设 SDK 具备在没有像 MVP 这样的设计模式的情况下 Android 所需的一切?

很高兴在我花费数百小时之前知道,请随时评论/回答这个问题的任何部分。

4

2 回答 2

3

Android 对糟糕的 MV(P|C) 设计的惩罚比我遇到的任何平台都多。忘记它提供的用于在活动堆栈上下传递状态的笨拙方法。从您的活动中获取尽可能多的状态和逻辑。根据需要将其移动到 Services、ContentProviders 和 SharedPreferences 中。尽量让你的活动成为纯粹的观点。IMO,服务在 Android 教程中从未得到足够的重视。甚至 O'Reilly Programming Android的书也只给了他们四分之一页!

小心扩展应用程序。如果您曾经在自己的进程中启动服务(例如,允许它在活动崩溃时正常关闭),那么服务将拥有自己的应用程序副本。

于 2014-05-06T01:18:24.020 回答
2

只是为其他可能感兴趣的人提供参考。几年前我也在想同样的事情。当我们将 MVC/ MVVM / Presentation Model应用到 android 应用程序时,我们真正想要的是有一个清晰的结构化项目,更重要的是更容易进行单元测试。目前,在没有第三方框架的情况下,您通常会有很多代码(如 addXXListener()、findViewById()...),这些代码不会增加任何业务价值。更重要的是,您必须运行 android 单元测试而不是普通的 JUnit 测试,这需要很长时间才能运行并且使单元测试有些不切实际。由于这些原因,几年前我们启动了一个开源项目RoboBinding- 适用于 Android 平台的数据绑定表示模型框架。RoboBinding 可帮助您编写更易于阅读、测试和维护的 UI 代码。RoboBinding 消除了对 addXXListener 之类的不必要代码的需求,并将 UI 逻辑转移到 Presentation Model,这是一个 pojo,可以通过正常的 JUnit 测试进行测试。RoboBinding 本身带有 300 多个 JUnit 测试以确保其质量。其他替代方案:Android-Binding、Bindroid 和 MvvmCross。

于 2014-05-17T01:31:26.460 回答