Android App Architecture

原文地址:

    https://blog.mindorks.com/essential-guide-for-designing-your-android-app-architecture-mvp-part-1-74efaf1cda40#.lkml1yggq

大多数人开始创建一个 Android APP 时会决定它的核心活动和能力以及如何去获取数据。代码会在一个又一个周期内发展,继而成为一系列不可重用的组件。我们开始打包这些组件,并在 Activity 中通过 api 来使用组件。我们觉得这种做法很优秀并开始将代码尽可能地打碎,直至我们沉浸在组件的海洋中才发现难以找到所需要的组件并使用。如果你有编写测试代码,我们稍后将介绍可测试的概念和如何更安全地回退代码。我们在 Android api 耦合性非常紧密的地方进行开发会感觉代码变得一团糟,这会防止我们去做 JVM 的测试和阻碍测试用例的简单设计。这就是 Activity 或 Fragment 作为控制器的经典 MVC 模式。

所以,我们制定了解决上述的绝大多数问题但是实现起来需要很小心的原则。这些原则,我们称之为MVP设计模式。

那么到底什么是MVP设计模式呢?

MVP设计模式是一套分离代码使其具有重用性和可测试性的指导方针。划分应用组件以此作为基线,称其关注点分离。

MVP 通过以下三个基本组件分离应用

Model:负责控制应用内的数据

View:负责在屏幕上显示特殊数据的视图

Presenter:负责 Model 和 View 之间的连接,也可扮演 VIEW 的指导者

MVP为上面提及的组件设定了一些规则,如下举例:

界面层唯一的职责就是在 Presenter 的指挥下绘制 UI。

View 代表所有传递给 Presenter 的用户操作。

View 层绝不直接与 Model 层沟通。

Presenter 层的职责是通过特殊事件将 View 层向 Model 发起请求和 Model 层通过行动指导 View 层工作。

Model 层负责取得来自服务器、数据库及文件系统的数据。

以上提到的原则有多种可以实现的方式。每一位开发者应该有自己对此的理解。概括来说,基本的螺母和螺栓在小改动中很常见。

现在,我写下了序言,遵循MVP模式。

Activity、Fragment和自定义控件在应用中应为 View 层的部分。

每一个 View 都有一个 Presenter 与其一对一的关系。

View 和它的 Presenter 通讯通过接口进行,反之亦然。

Model 层可分为多个部分:APIHelper、PreferenceHelper、DataBaseHelper和FileHelper。这些所有的Helper都属于DataManager(数据管理者),在本质上把所有的 Model 部分连接起来。

Presenter 与 DataManager 的通讯通过接口进行。

DataManager 只有在请求的时候才会执行。

Presenter 不会有任何 Android 的 api.

现在,这些信息可以明显地从任何博客或者MVP的安卓规范中找到。那么这篇文章的要点是什么?

这篇文字是为了解决一个MVP中重要的挑战而写的。如何在整个应用中真正地实行这些规范?

MVP展现一个简单的 Activity 例子时显得非常简单,但当我们尝试对应用中的所有组件绑定在一次的时候感到困惑。

首先我们简单描绘这种架构的蓝图。

架构是你实现任何软件第一件想到的事情。当一个精美的架构可以提供稳定和可扩展性,它将极大地减少在未来的重复工作。如今,大多数的项目都是以团队进行开发,因此在这个架构中,最重要的元素为代码的可读性和模块性。

我们非常依赖第三方库,并且由于用例、bug、辅助的原因,我们不断在可选方案之间切换。所以我们的架构应该被设计成即插即用。

这个安卓架构的蓝图画在包含所有MVP特性和MVP原则之上。

下面的内容在第一次阅读可能会感到被困惑淹没,但在你贯穿这篇文章整个下部分的例子,将会对这些概念豁然开朗。

那些渴求知识的人将得到它。

让我们先来明白每一个部分在架构中的作用。 View: 这个部分操控UI和接受来自用户的交互。由Activity,Fragment,自定义控件共同组成。 MVPView: 这是一个借口,它被View实现。它包括一些暴露给Presenter用于通讯的方法。 Presenter: 这是View层的决策者,它由纯Java类构成,没有任何Android 的 API 。它接受来自View传递过来的用户交互,同时它对最基本的业务逻辑起决策作用。最后指挥 View 去执行特殊的动作。它也和DataManager通讯,以获得处理业务逻辑所需要的数据。 MVPPresenter: 这是一个借口,它被Presenter所实现,它包含一些暴露给View的方法APPDBHelper: 数据库管理和所有关联到数据库的操作在这一部分实现。 DBHelper: 这是一个被APPDBHelper 实现的借口,包含暴露给Application组件的方法。这一层将任何特殊的实现分离,因此使APPDBHelper成为即插即用的单元。 AppPreferenceHelper : 这是一个类似APPDBHelper 但它的工作是在android sp中读写数据。 PreferenceHelper: 接口层,类似DBHelper,但是被APPPreferenceHelper所实现。 APPAPIHelper: 负责管理网络层API调用和控制API数据。 APIHelper: 接口层,类似DBHelper 但被APPAPIHelper所实现。 DataManager: 这是一个接口,被APPDataManager所实现。它包含方法,暴露于所有管理数据操作的方法。理想地,它代理提供给所有Helper类的服务。DataManager借口扩展了DBHelper,PreferenceHelper 和 APIHelper借口。 AppDataManager: 这是一个涉及任何数据相关操作的接口。DBHelper,PreferenceHelper和APIHelper只为DataManager工作。它将所有特定的操作委托给每一个Helper。

现在,我们熟悉了所有的组件以及他们在Application中的角色。我们现在为各种不同组件规划沟通模式。 Application类的实例化APPDBHelper,APPPreferenceHelper,APPAPIHelper和APPDataManager,方法是向它传递DbHelper, PreferenceHelper 和Helper的引用。 View 组件的实例是Presenter通过MVPPresenter 的引用。 Presenter接受他的View组件和通过MVPView操控它,Presenter也接受DataManager。 DataManager是单例。

这是application 实现MVP的基本方针。

就像一个外科医生教授所有的外科程序,不会有任何用处,直至它真正执行和练习它。我们不能理解这些idea直至我们真正去使用它。

在下一个章节,我们将探索一个真实的APP例子和有希望去明白和很好地理解这些概念。

Part2

在第一个章节,我们介绍了MVP的概念和在Android应用架构中如何实现蓝图。如果你没有阅读第一章节,则这篇章节会有很多地方让你不明白。所以,在你继续阅读前请先移步第一章节。

我们将在第一章提到的蓝图为基础上,用MVP架构实现一个完整的Android应用。

这个项目的开发是为了提供适当的方法去构建一个Android APP。它包含大多数情况下APP所有必须的代码块。

这个项目一开始会让你觉得非常复杂,但只要你花费时间去探索,你将拨开它的迷雾。这个项目以Dagger2,RxJava,FastAndroidNetworking和PlaceHolderView 为基础。

通过这个项目来学习,研究它每一个代码,如果它们存在BUG或你能找到更加优秀的逻辑实现,请创建一个下拉请求。我们逐步地写测试,所以你空闲的时候也可以对其创建下拉请求来作贡献。

这个APP有一个登陆页和主页。登录页实现私有账号及谷歌和Facebook的第三登陆。第三方登录使用虚假的api来实现。登陆功能基于获取token,token用于后续访问api。主界面创建了卡片,有关于MVP的问题。这个库包含的代码是展示了作为骨架的绝大多数的应用组件是如何工作。

整个APP包结构应该分为五个部分:

data:包含所有数据获取及他们的组件。

di:依赖使用Dagger2提供的类。

ui:视图类和与他们通讯的Presenter

service:应用服务。

utils:公共类。

类被设计成尽可能最大化被复用。

这有许多有趣的部分,如果我尝试在开始就解释他们会导致一次性引入太多概念。所以我觉得最合适是对核心理念进行解释,读者可以通过项目来掌握这样的概念。我建议你在这个项目上至少花费一周时间来进行研究学习。

学习 build.gradle 和查看所有在使用的依赖。

探索数据包和实现Helper类。

ui基础包创建Activity Fragment SubView 和 Presenter的基本实现。所有其他引用组件应该被这个类派生出来。

di 包 应用内是提供依赖的类,明白依赖的注入,通过Dagger2的说明来了解。

资源文件:styles,fonts,drawable.

通过第三篇文章掌握MVP在Dialogs,ViewPager,RecyclerView 和Adapters 的用法。

https://blog.mindorks.com/essential-guide-for-designing-your-android-app-architecture-mvp-part-3-dialog-viewpager-and-7bdfab86aabb

如果你的项目有很多开发人员同时工作和项目内容非常巨大,则阅读这篇关于MVP延伸的文章。

https://blog.mindorks.com/android-mvp-architecture-extension-with-interactors-and-repositories-bd4b51972339

Part3

非常高兴我们在这一系列文章的第一第二章节中构建起MVP架构非常受欢迎,项目库通过你的努力会更加完善。

在开发的过程中,你在这个架构中寻求很多关于基于View的实现的Dialog 和 Adapter。

在这个案例中,你不用阅读很早的资源,我非常推荐这些在你读这篇文章之前。这是他们的链接。

https://blog.mindorks.com/essential-guide-for-designing-your-android-app-architecture-mvp-part-1-74efaf1cda40

https://blog.mindorks.com/essential-guide-for-designing-your-android-app-architecture-mvp-part-2-b2ac6f3f9637

https://github.com/MindorksOpenSource/android-mvp-architecture

在这篇文章,我们将对这个架构的评级对话框和Activity进行延伸。

首先列下所有特性和用例。

这个对话框会显示五颗星来供用户选择他对APP的使用体验。

如果星星数量少于5,我们修改对话框,通过询问改进来反馈。

如果星星数量等于5,我们显示应用商店排名选项来供用户添加评论。

排名信息将会发送到APP后端服务器。

这个评分对话框是用户终端的非必须特性,但是对开发人员终端来说具有非常高价值。所以这款应用必须非常巧妙地执行这一功能。

我推荐使用大空间来间隔两个连续的编程方式评分对话框的显示。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,482评论 25 707
  • 前言 老板让我搭建一个APP,我该怎么快速上手?现在常用的Android应用总体架构是什么样的?Android开发...
    JasonXiao阅读 1,244评论 0 11
  • 作者:李旺成 时间:2016年4月3日 “Android MVP 详解(下)”已经发布,欢迎大家提建议。 MVP ...
    diygreen阅读 128,815评论 86 1,321
  • 总是想这是什么 有时想为什么 到达那里 请别问我想什么 想,己经停止 思考,消失 能看 眼睛是主人 光与影 你在无...
    幸仁荷阅读 191评论 0 1
  • 在一个温暖有风的清晨 阳光收纳进吐蕊的花瓣里芬芳馥郁 三三两两的人群走过 耳畔的汽鸣声 夹杂着秋日的凉爽 匆忙的脚...
    素瓜豆阅读 211评论 0 3