Android应用程序架构-建议的模型是什么?

59

与 Web 或桌面应用程序可能具有三个或 n 个层次结构 - 如 UI、业务、数据 等 - 相似,对于 Android 应用程序,建议的结构是什么?如何将类组合在一起,有哪些层级等?

我刚开始进行 Android 开发(一个必须响应传入通知的基于互联网的应用程序),并没有真正了解我要达到的结构。欢迎提供建议。


尽管这个问题很久以前就提出了,但它仍然没有被选中的答案,这可能对那些仍然有这个问题的人没有帮助。我认为@pcjuzer的答案非常好,并回答了这个问题。对于那些想要更多关于这个主题的细节的人,我在这里写了一系列文章:http://www.digigene.com/android-architecture-wolfkcats2 - Ali Nem
5个回答

17
IMHO,Android“想要”遵循MVC模式,但在活动中视图和控制器通常是紧密耦合的。这使得单元测试更加困难,并且很难遵守单一职责原则
我发现这里介绍了一个非常好的Android架构,或许可以有所启示。所有东西都是松散耦合的,因此更容易进行测试和编辑。

显然,我相信还有很多其他可能性(比如MVP模式(Model View Presenter) - 这里有关于Android中MVP的答案),但你仍然应该看一下它。


1
Android想要遵循MVC模式,为什么? - Yousha Aleayoub

16

我已经从一个服务器端背景工作转到了Android领域,进行了9个月的工作,全面的单元测试和分层架构在服务器端是很常见且有效的。

通过大量的试验和错误,我强烈建议使用Model View Presenter模式,而不是Model View Controller。

我发现一个巨大的问题是Activity/Fragments有一个超出您控制范围的生命周期,可能会导致意外问题。

例如,我们的主要android应用程序想要在平板电脑上使用横向模式。我们在OnCreateView()或OnCreate()中实现这一点。

在Nexus 7上,默认视图是纵向的,所以它会在纵向模式下启动Activity,然后我们的代码说转到横向模式,最终Android会创建三个activity类!

我们已经将网络请求挂钩到onCreate上,但在这种情况下,它们会发生三次。

当然,我们可以添加逻辑来查找重复调用,但在我看来,在架构上将UI与业务逻辑分离会更好。

我的建议是使用工厂模式从Activity创建Presenter,但确保工厂始终只返回相同的实例。Presenter可以包含逻辑来执行网络请求、查找重复项并返回缓存的结果和一般业务逻辑。

当网络调用返回结果时,要么发布到总线(如Otto),该Activity(在onResume()上注册事件并在onPause()期间注销)已经注册,要么确保Activity实现的回调接口已被更新为Presenter中的最后一个Activity。

这样,Presenter以下的代码是可单元测试的,并且不依赖于不稳定的UI层测试。


15

在Android中,操作、视图和活动是处理Android UI的内置方式,它们是模型-视图-视图模型(MVVM)模式的实现,结构上类似于(同一家族的)模型-视图-控制器(MVC)。

据我所知,没有办法打破这个模型。虽然可能可以做到,但你可能会失去现有模型带来的所有好处,并且必须重写自己的UI层才能使其工作。

以下是可以找到MVC的内容:

  • 您可以根据分辨率/硬件等在各种XML文件中定义用户界面
  • 您可以在各种XML文件中定义资源,例如地区等。
  • 您可以将数据存储在SQLite或/assets/文件夹中的自定义数据中,更多关于资源和资产的信息。
  • 您可以扩展像ListActivityTabActivity这样的类,并通过布局填充器使用XML文件。
  • 您可以为自己的模型创建任意数量的类,并拥有自己的包,以充当结构。
  • 已经为您编写了许多实用工具。DatabaseUtils、Html等

并没有一种单一的MVC模式需要遵守。 MVC只是更多或少地说明您不应混合数据和视图,例如视图负责保存数据或直接影响视图的处理数据的类。

但是,安卓处理类和资源的方式有时甚至迫使您遵循MVC模式。在我看来,更加复杂的是活动(activities),它们有时负责视图但同时充当控制器。

如果您在xml文件中定义视图和布局,在res文件夹中加载资源,并且避免在代码中混合这些内容,那么您无论如何都在遵循MVC模式。


18
你没有回答他的问题。你回答了关于用户界面架构的问题。我认为他的问题更多地涉及全局应用程序架构:我们应该制作分离的层,例如Presentation(=MVC)、业务逻辑和数据持久性。这种模式在Web应用程序中非常普遍。 - clemp6r
同意@clemp6r的观点。 - Vinícius Fonseca

7

2
这是一个专门为Android Architecture蓝图设计的项目,其中包含有良好记录的源代码。所有这些都基于MVP模式,并加入了一些变化。此外,请查看各种解决方案的比较,如代码行数、可测试性、学习成本以及它们支持增加数据复杂度的情况。哪个蓝图最适合特定开发应用程序和上下文(时间市场、开发人员、未来计划等)取决于具体情况。请参考:Android Architecture蓝图对比

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接