Android应用程序架构——MVVM还是MVC?

2024-04-04

我有一个正在开始处理的 android 项目,我希望它的结构尽可能健壮。

我有 WPF MVVM 背景,并且阅读了一些有关 Android 应用程序架构的内容,但我找不到关于我应该使用哪种架构的直接明确的答案。

有些人建议使用 MVVM -http://vladnevzorov.com/2011/04/30/android-application-architecture-part-ii-architectural-styles-and-patterns/ http://vladnevzorov.com/2011/04/30/android-application-architecture-part-ii-architectural-styles-and-patterns/

和其他人建议使用 MVC,但没有具体说明它应该如何实现。

正如我所说,我来自 WPF-MVVM 背景,因此我知道它严重依赖于绑定,据我所知,Android 默认情况下不支持绑定。

似乎有一个第三方解决方案 -http://code.google.com/p/android-binding/ http://code.google.com/p/android-binding/但我不知道我是否愿意依赖它。如果它的开发停止并且未来的 API 等不再支持怎么办?

基本上我正在寻找的是一个全面的教程,它将教我构建应用程序结构的最佳实践。文件夹和类结构等。我只是找不到任何完整的教程,我希望谷歌会为其开发人员提供这样的教程。我只是认为这种文档在技术方面的处理不够好 -http://developer.android.com/guide/topics/fundamentals.html http://developer.android.com/guide/topics/fundamentals.html

我希望我已经说得足够清楚了,我没有要求太多,我只是想在我的代码变成意大利面条怪物之前确定我的应用程序的结构。

Thanks!


首先,Android 并不强迫你使用任何架构。不仅如此,它还使得尝试遵循任何内容都有些困难。这将要求您成为一名聪明的开发人员,以避免创建意大利面条式的代码库:)

您可以尝试适应任何您知道且喜欢的模式。我发现,当您开发越来越多的应用程序时,最好的方法会以某种方式进入您的内心(对此感到抱歉,但一如既往,您将不得不犯很多错误,直到您开始做正确的事情)。

关于您所知道的模式,让我做一些错误的事情:我将混合三种不同的模式,以便您了解 Android 中的功能。我相信 Presenter/ModelView 应该位于 Fragment 或 Activity 中的某个位置。适配器有时可能会完成这项工作,因为它们处理列表中的输入。也许活动也应该像控制器一样工作。模型应该是常规的 java 文件,而视图应该位于布局资源和一些您可能必须实现的自定义组件中。


我可以给你一些建议。这是社区维基的答案所以希望其他人可能会提出其他建议。

文件组织

我认为主要有两种合理的可能性:

  • 组织一切type- 为所有活动创建一个文件夹,为所有适配器创建另一个文件夹,为所有片段创建另一个文件夹等
  • 组织一切domain(也许不是最好的词)。这意味着与“ViewPost”相关的所有内容都将位于同一文件夹中 - 活动、片段、适配器等。与“ViewPost”相关的所有内容都将位于另一个文件夹中。对于“EditPost”等也是如此。我想活动会强制您创建的文件夹,然后会有一些更通用的基类文件夹。

就我个人而言,我只参与过使用第一种方法的项目,但我真的很想尝试第二种方法,因为我相信它可以使事情更有条理。我认为拥有一个包含 30 个不相关文件的文件夹没有任何优势,但这就是我使用第一种方法得到的结果。

Naming

  • 创建布局和样式时,请始终使用使用它们的活动 (/fragment) 的前缀来命名(或标识它们)。

因此,在“ViewPost”上下文中使用的所有字符串、样式、id 都应以“@id/view_post_heading”(例如,对于文本视图)、“@style/view_post_heading_style”、“@string/view_post_greeting”开头。

这将优化自动完成、组织、避免名称冲突等。

基类

我认为您将希望使用基类来完成您所做的几乎所有事情:适配器、活动、片段、服务等。这些至少对于调试目的可能很有用,以便您知道所有活动中正在发生哪些事件。

General

  • 我从不使用匿名类 - 这些很丑陋,并且当您尝试阅读代码时会分散您的注意力
  • 有时我更喜欢使用内部类(与创建专用类相比) - 如果一个类不会在其他地方使用(而且它很小),我认为这非常方便。
  • 从一开始就考虑一下您的日志系统 - 您可以使用 Android 的日志系统,但要充分利用它!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android应用程序架构——MVVM还是MVC? 的相关文章

  • Android KeyBoard.Key 禁用图标 预览特殊键?

    我通过实现 KeyboardView OnKeyboardActionListener 接口来自定义自己的软键盘 按下按键时 将显示预览弹出窗口 我的问题是如何禁用 SHIFT 和 DELETE 等特殊键的预览弹出窗口 我尝试将 andro
  • 是否可以使用最新的 APP_PLATFORM,同时仍保持向后兼容性?

    这是我的 Application mk APP ABI armeabi v7a APP PLATFORM android 16 APP OPTIM release APP STL gnustl static APP CPPFLAGS std
  • Android 上的 Firebase:如何检查 Firebase 身份验证失败原因?

    我在 Android 上使用 Firebase 和 Firebase Auth 功能 I try FirebaseAuth signInWithEmailAndPassword如果失败 我想知道为什么登录过程失败 The signInWit
  • 使用 APDU 命令的有效 NFC 读取比特率是多少?

    我目前正在使用 Android IsoDep trancieve 函数发送和接收累计 1628 字节的数据 该函数分布在 35 个 APDU 命令 选择应用程序 身份验证 读取 中 字节计数包括返回的 MAC 校验和以及由 transcie
  • Android Studio:lambda 不起作用[重复]

    这个问题在这里已经有答案了 当尝试使用 lambda 表达式时 我遇到了一些 Gradle 构建错误 错误 41 100 错误 source 1 7 不支持 lambda 表达式 使用 source 8 或更高版本来启用 lambda 表达
  • 按钮未显示在屏幕上

    我创建了一个应用程序 其中显示带有图像和文本的列表视图 我在页面末尾添加按钮 但这没有显示在屏幕上 我是 Android 新手 我该如何解决这个问题 这是我的 UI XML 代码
  • Android - 当不在栏顶部时推送通知空白

    我在使用 Android 推送通知时遇到一个小问题 如果有 3 个通知 并且只有其中一个显示标题和消息 位于酒吧顶部的那个 如果有人知道可能是什么问题 请告诉我 请参阅此链接上的图像 这就是我接收通知的方式http postimg org
  • 如何在 Android 上创建 YouTube 的双击手势?

    我在 Android 上有 exoplayer 的应用程序 我已经创建了 youtube双击手势用动画向前或向后跳跃 10 秒 如何在双击时创建具有波纹效果的半圆 像这样 这个怎么做 我也想实现这样的功能 所以我自己编写了它来 复制 You
  • Android-工具栏中的SearchView

    我只想在我的应用程序中添加 searchview 但我不想搜索任何东西 只是我想要用户输入的查询 到目前为止 我尝试了这段代码 但是当我运行我的应用程序时它崩溃了 Update 我尝试了这个 但即使我的应用程序崩溃了 main menu x
  • 使用 Android 播放任意音调

    有没有办法让Android发出任意频率的声音 意思是 我不想预先录制声音文件 我环顾四周 音调发生器 http developer android com reference android media ToneGenerator html
  • Android中不同线程的数据库访问

    我有一个在 AsyncTasks 中从互联网下载数据的服务 它解析数据并将其存储在数据库中 该服务持续运行 当服务写入数据库时 活动会尝试从数据库中读取更改 我有一个数据库助手 有多种写入和读取方法 这会导致问题吗 可能尝试从两个不同的线程
  • 获取可以共享数据的应用程序列表

    此代码显示默认共享对话框 Intent sharingIntent new Intent Intent ACTION SEND sharingIntent setType text html sharingIntent putExtra a
  • Android Web Intent 问题

    G day 免责声明 我不是 Android 开发人员 我正在对我所描述的问题进行质量检查 我用来描述这个问题的技术术语可能是错误的 我正在测试一个 Android 应用程序 该应用程序在其清单中描述它可以使用 type 的地址处理 Web
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • Android GCM 服务器的 API 密钥

    我有点困惑我应该为 GCM 服务器使用哪个 API 密钥 在文档中它说使用 android api 密钥 这对我不起作用并且总是给出未经授权的 http developer android com google gcm gs html ht
  • 通过列表视图检查动态生成的复选框时遇到问题

    我知道其他成员已经提出了这个问题 一些成员也给出了解决方案 但问题是我没有找到任何适合我的应用程序的解决方案 我正在创建一个应用程序 其中我有一个屏幕 它将显示动态列表视图 其中包含列表项 复选框和三个文本视图 一个用于候选人姓名 另外两个
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • 如何以编程方式创建活动转换?

    我想以编程方式创建一个动画 以从触摸屏点启动具有缩放效果的活动 接下来我模拟缩放输入效果
  • Android ADT Eclipse 插件,parseSDKContent 失败

    我刚刚设置了我的第一个 Android 开发环境 其中包括 日食3 5 Mac OS X 10 5 适用于 x86 mac 的 Android SDK ADT Eclipse 插件 0 9 6 我已将 set PATH 设置为我的 SDK
  • putFragment() - 片段 x 当前不在 FragmentManager 中

    上面的标题被问了很多次 但答案似乎与FragmentStatePagerAdapter这与我的问题无关 我正在使用该方法putFragment Bundle String Fragment 直接地 The 安卓文档 http develop

随机推荐

  • Python 和/或 C/C++ 中的高精度算术?

    摘要 哪个 Python 包或 C 库是非常高精度算术运算的最佳选择 我有一些转换小数天数的函数 0 0 0 99999 转换为人类可读的格式 小时 分钟 秒 但更重要的是 毫秒 微秒 纳秒 转换是通过以下函数完成的 请注意 我还没有实施时
  • .Net DataView 和 DataTable 绑定

    我有一个简单的 Windows 窗体应用程序 它将 DataView 绑定到 ListBox 此 DataView 使用 Linq 按特定列降序对我的 DataTable 进行排序 然后我的列表框绑定到数据视图 然后我有一个简单的表单来将数
  • 每次发布后我应该关闭通道/连接吗?

    我在 Node js 中使用 amqplib 但我不清楚代码中的最佳实践 基本上 我当前的代码调用amqp connect 当 Node 服务器启动时 然后为每个生产者和每个消费者使用不同的通道 而不会真正关闭它们中的任何一个 我想知道这是
  • 在 dplyr 中过滤字符串列上的多个值

    我有一个data frame其中一列中包含字符数据 我想过滤多个选项data frame来自同一列 有没有一种简单的方法可以做到我所缺少的 Example data frame name dat days name 88 Lynn 11 T
  • 如何创建案例类的随机实例?

    假设我有几个案例类 例如 case class C c1 Int c2 Double c3 Option String case class B b Int cs Seq C case class A a String bs Seq B 现
  • 在线算法和离线算法有什么区别?

    这些术语在我的数据结构教科书中使用过 但解释非常简洁且不清楚 我认为这与算法在每个计算阶段拥有多少知识有关 请不要链接到维基百科页面 我已经阅读过它 并且仍在寻找澄清 像我十二岁一样的解释和 或示例会更有帮助 维基百科 维基百科页面非常清楚
  • 进程本地覆盖名称解析?

    我有测试代码 我希望在测试时将几个主机名解析为环回 部署后 此代码将根据需要使用正常的系统名称解析 测试和部署主机是最新的 Linux 发行版 例如 SLES11SP1 我想覆盖单个进程的主机名解析 而不是超级用户 有没有办法操纵nsswi
  • Django - 收到来自外部站点的流请求

    如何使用 Django 从用户请求触发的外部 API 获取数据 并将其直接流回请求周期而不使用 或渐进 最小 内存使用 背景 作为连接外部托管微服务的短期解决方案 需要限制用户对未经身份验证的 API 的访问 基于 Django 应用程序的
  • 如何从 ggplot2 包中仅绘制 geom_point 中的一系列值?

    Hello All I have the following molten data X variable value 1 StationA SAR11 cluster 0 001309292 2 StationB SAR11 cluste
  • 登录后保持会话 - selenium - javascript

    我正在尝试使用 selenium web driver 和 Node js 自动化几个页面 我能够登录 但登录后我想使用由网络驱动程序启动的相同会话 以便我可以在会话受保护的页面上进行自动测试 这是我的尝试 async function l
  • 如何将报表设计器标尺单位从英寸更改为厘米?

    一个简单的 我希望 问题 我正在使用 Visual Studio 我在 SQL Server Business Intelligence Development Studio 中创建一个新报告 在布局视图中 标尺的单位是英寸 我想将其更改为
  • Python函数返回字典?

    我是一名 Python 初学者 我遇到了一个我不理解的函数的输出 我无法提供所有代码 因为其中一些是我公司的 IP 我基本上使用我们的一位开发人员编写的库从数据仓库中提取指标 然后我想在另一个应用程序中使用这个指标值 当我获得该值时 我会将
  • 如何在 Gradle 中遮蔽传递依赖?

    有没有办法在 Gradle 中隐藏特定的 传递 依赖项 我的情况 我有一个项目直接依赖com amazonaws aws java sdk emr 1 10 33 and org apache hadoop hadoop aws 2 7 1
  • 如何使用 Scala Stream 类读取大型 CSV 文件?

    如何使用 Scala Stream 读取大型 CSV 文件 gt 1 Gb 你有代码示例吗 或者您会使用不同的方式来读取大型 CSV 文件而不先将其加载到内存中吗 只需使用Source fromFile getLines正如你已经说过的 这
  • 为什么我无法手动提交此表单?

    我试图在提交表单之前完成一些事情 以下代码运行没有错误 但我的表单从未提交 我不知道出了什么问题
  • 在Azure函数中设置cors标头

    在我的 Azure 函数中 我尝试设置 cors 标头 var response req CreateResponse HttpStatusCode OK response Content new ObjectContent
  • 使用返回 Future 的函数映射 Stream

    有时我发现自己处于这样的境地 Stream X and a function X gt Future Y 我想组合成一个Future Stream Y 而且我似乎找不到办法做到这一点 例如 我有 val x 1 until 10 toStr
  • 如何删除 Apache Mesos 中的孤立任务?

    该问题可能是由 Mesos 和 Marathon 引起的不同步 https github com mesosphere marathon issues 616 但是 GitHub 上提到的解决方案对我不起作用 当我发现孤立任务时 我所做的是
  • 构建成功时 Eclipse (CDT) 中出现可疑错误消息

    使用面向 C C Linux 开发人员的 Eclipse IDE 版本 Indigo释放 与克 4 1 2 on 科学 Linux CERN 5 RHEL 5 我目前正在开发一个项目 其中使用Qt4GUI 以及 Apache 的log4cx
  • Android应用程序架构——MVVM还是MVC?

    我有一个正在开始处理的 android 项目 我希望它的结构尽可能健壮 我有 WPF MVVM 背景 并且阅读了一些有关 Android 应用程序架构的内容 但我找不到关于我应该使用哪种架构的直接明确的答案 有些人建议使用 MVVM htt