Android开发-浅谈架构(一)

写在前面的话

嗯 聊聊架构。 这段时间一直在维护旧项目。 包括自己之前写的新项目 越来越发现 一个架构清晰的项目往往让人赏心悦目。不至于在一个bug丢过来之后手足无措。包括以后别人接收自己的项目 能很快上手 何乐而不为呢?

曾经的”MVC”

先从我们曾经的 “MVC” 说起, “MVC” 全名 “Model View Controller”.
即 视图层(View), 控制层(Controller),模型层(Model).
他们之间的关系 如图:

 

视图层(View) 一般由 xml布局文件担任
控制层(Controller) 一般由 activity和fragment 担任
模型层 (Model) 一般指的是 抽离出来的接口扩展。 尝尝可以复用的那一部分。 你只需要把接口 在Controller 抛出。 更新 View即可。

写到这里 我们知道android中 Controller 控制层一般有Activity(主要)和fragment 担任。但是activity类中 常常包含一些ui 初始化 或者 网络 第三方sdk 的初始化。这样写起代码 activity类就会变得臃肿。而且不够优雅。那么MVP就诞生了:

MVP

MVP 是从MVC 中演变过来的。即:Model(模型层) View(视图层) Presenter(主要作为View和model交互的一个纽带 扮演 “主持交互”的角色。处理交互逻辑。)关系如图:

大家看这个图 也许不是很清楚或者说不是太理解。
在这里 “View” 由presenter中的接口担任 实现向View实现类通信,你也可以在Android组件中实现它。有时最好直接使用Activity,Fragment或自定义View。>The view that receives commands from a presenter in MVP, is referred to as “view”

先说Model: 它是一个负责管理数据的接口。模型的职责包括使用API、缓存数据、管理数据库等。该模型也可以是一个接口,与其他模块负责这些职责的沟通。例如,如果您使用的是存储库模式,则该模型可能是一个存储库。如果您使用的是干净的建筑,相反,该模型可以关联。(翻译过来略显生硬 简而言之 Model层是数据访问层,如数据库API或远程服务器API)

Presenter:大家可以看到Model和View是完全没有交互的。那么 Presenter则担当Model与View之间的中间人。你所有的业务逻辑都属于它。Presenter负责查询模型和更新视图,响应用户交互更新模型。

先说Model: 它是一个负责管理数据的接口。模型的职责包括使用API、缓存数据、管理数据库等。该模型也可以是一个接口,与其他模块负责这些职责的沟通。例如,如果您使用的是存储库模式,则该模型可能是一个存储库。如果您使用的是干净的建筑,相反,该模型可以关联。(翻译过来略显生硬 简而言之 Model层是数据访问层,如数据库API或远程服务器API)

Presenter:大家可以看到Model和View是完全没有交互的。那么 Presenter则担当Model与View之间的中间人。你所有的业务逻辑都属于它。Presenter负责查询模型和更新视图,响应用户交互更新模型。

View:The view can be implemented by Activities, Fragments, any Android widget or anything that can do operations like showing a ProgressBar, updating a TextView, populating a RecyclerView and so on.(这个翻译起来有点尴尬 感觉大家应该都能看懂)

官方给的代码片段说明:

在写MVP模型之前 我们有必要搞清楚这样几个问题:

  1. 什么是 “View”
  2. 怎么写Model
  3. 如何理解View 界面 等
  4. 如何写Presenter 并且完成很好的交互 解耦

参考这篇文章 作者写的很明白 我就不做多余的描述

 

其实网上大部分讲解都是套三者之间的关系交互图来讲的。只有理解了尝试敲几遍就差不多会了。另外 符合项目需要的才是最好的。下面我尝试着动手仿照 ONE 一个app将MVP模式套入其中练手(项目会不断完善的 架构 分包开始)

先截个图 看一下目前大致的结构。
Dagger2+RxJava+Retrofit

没用到Presenter之前 HomeActivity中:


fragmentUtil.switchTo(OneFragment.class); radioGroup.setOnCheckedChangeListener((group1, checkedId) -> { switch (checkedId) { case R.id.home_one: fragmentUtil.switchTo(OneFragment.class); break; case R.id.home_reading: fragmentUtil.switchTo(ReadingFragment.class); break; case R.id.home_music: fragmentUtil.switchTo(MusicFragment.class); break; case R.id.home_movie: fragmentUtil.switchTo(MovieFragment.class); break; default: break; } });

 

Presenter实现 

if(presenter==null)
presenter = new MainTabPresenter(this, mBinding.radio);
presenter.switchTo();


代码排版不是很好。
github地址Dagger2+Retrofit+RxJava
简单的逻辑代码交由Presenter 和Model协作实现。可能表述 和理解的不是太好 欢迎指正。Demo架构Dagger2+RxJava+Retrofit 雏形已经大致出现 后面会陆续补充一些使用的小技巧 和 第三方的插入 譬如 微信热修复 等等吧。谢谢大家~

参考:

MVC vs. MVP vs. MVVM on Android

Android App的设计架构:MVC,MVP,MVVM与架构经验谈

官方MVP Dagger2示例

等等 分享几个免费的api(侵删 谢谢)
干货Api

和风天气

ONE一个接口

欢迎加群:
QQ 群 521039620
简书博客地址

 

posted @ 2017-05-05 14:23  一座城池2012  阅读(4260)  评论(1编辑  收藏  举报