前言:
于没有一套权威的架构实现,现在很多App项目中在架构方面都有或多或少的问题。
第一种常见问题是没有架构,需求中的一个页面对应项目中的一个activity或一个fragment,所有的界面响应代码、业务逻辑代码、数据请求代码等等都集中在其中。
第二种常见的问题是架构实现的不断变化,不断在各种架构间摇摆,一直找不到一个适合自己的架构。
google在官方示例中给出了一系列不同架构的app实现
一、项目介绍
项目名称:android-architecture
项目地址为:https://github.com/googlesamples/android-architecture
项目目的:项目目的是通过展示各种架构app的不同方式来帮助开发者解决架构问题。项目中通过不同的架构概念及方式实现了功能相同的app。你可以用示例来当做参考,或是干脆拿来当做创建app项目的基础。项目中,希望大家能把关注点集中到代码结构、整体架构、可测试性、可维护性这四个方面。当然实现app有很多种方式,千万不要把它当做定式。
已经完成的项目示例:
todo-mvp(mvp基础架构示例)
todo-mvp-clean(基于mvp基础架构项目,使用了clean架构的概念)
todo-mvp-dagger(基于mvp基础架构项目,使用了dagger2进行依赖注入)
todo‑mvp‑rxjava
todo‑mvvm‑databinding
todo‑mvvm‑live
项目选择:这个还是需要开发者自己来做决定,每个项目的说明文件中都说明了该实现的特性。app规模、团队状况、维护工作量的大小、平板是否支持、代码简洁程度偏好,这些都会影响你的选择。
二、项目说明——todo-mvp
MVP是一种思想,并不是一种代码组织形式:
平时用到较多的一种组织方式是按照类型,比如按照activity、adapter、fragment、contract、presenter等进行划分,不同的类文件分别放到不同的目录中,两种方式没有什么太大的区别,完全看个人喜好。如
todo-mvp项目的src目录的代码组织方式完全是按照功能来组织的,功能内部分为xactivity、xcontract、xfragment、xpresenter四个类文件(x代表业务名称),如下。
todoapp
|
|——App
| |
| |——jniLibs
| | |
| | |——armeabi
| | | ——nativelib.so
| | |
| | |...
| |
| |——libs
| |
| |——src
| | |——main
| | | |——java
| | | | |
| | | | |——com.example.android.architecture.blueprints.todoapp(包名)
| | | | | |
| | | | | |
| | | | | |(model层实现:项目中model层最大的特点是被赋予了数据获取的职责,与我们平常model层只定义实体对象截然不同,实例中,数据的获取、存储、数据状态变化都是model层的任务,
| | | | | |presenter会根据需要调用该层的数据处理逻辑并在需要时将回调传入。这样model、presenter、view都只处理各自的任务,此种实现确实是单一职责最好的诠释)
| | | | | |
| | | | | |——data(仓库,用于存本地和远程存储数据)
| | | | | | |——source
| | | | | | | |——remote
| | | | | | | |——local
| | | | | | | |
| | | | | | | ......
| | | | | |
| | | | | |
| | | | | |
| | | | | |——XXTask1
| | | | | | |——activity(activity在项目中是一个全局的控制者,负责创建view以及presenter实例,并将二者联系起来)
| | | | | | |——fragment(将fragment作为view层的实现类,第一个原因是我们把activity作为一个全局控制类来创建对象,把fragment作为view,这样两者就能各司其职。
| | | | | | | 第二个原因是因为fragment比较灵活,能够方便的处理界面适配的问题)
| | | | | | |——presenter(presenter构造函数中调用了view得setPresenter方法将自身实例传入,start方法中处理了数据加载与展示。如果需要界面做对应的变化,直接调用view层的方法即可。)
| | | | | | |——Contract(契约类:用来统一管理view与presenter的所有的接口定义)
| | | | | |
| | | | | |
| | | | | |——XXTask2
| | | | | | |——activity
| | | | | | |——fragment
| | | | | | |——presenter
| | | | | | |——Contract(契约类:用来统一管理view与presenter的所有的接口定义)
| | | | | |
| | | | | |
| | | | | |(BasePresenter与BaseView,两类分别是所有Presenter与View的基类。)
| | | | | |——BasePresenter(BasePresenter中含有方法start(),该方法的作用是presenter开始获取数据并调用view中方法改变界面显示,其调用时机是在Fragment类的onResume方法中。)
| | | | | |——BaseView(BaseView中含方法setPresenter,该方法作用是在将presenter实例传入view中,其调用时机是presenter实现类的构造函数中)
| | | | | |
| | | | | |
| | | | | |——util
| | | | | |
| | | | | |......
| | | |
| | | |
| | | |
| | | |——res
| | | |
| | | |——AndroidManifest.xml
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |——androidTest (UI层测试)
| | |
| | |
| | |——androidTestMock (UI层测试mock数据支持)
| | |
| | |
| | |——mock (业务层单元测试mock数据支持)
| | |
| | |
| | |——test (业务层单元测试)
| | |
| |
| |
| |
| |——xxx.keystore
| |
| |——build.gradle
| |
| |......
|
|
|——library
| |——build.gradle
| |——...
|
|——build.gradle
|
|——settings.gradle
于没有一套权威的架构实现,现在很多App项目中在架构方面都有或多或少的问题。
第一种常见问题是没有架构,需求中的一个页面对应项目中的一个activity或一个fragment,所有的界面响应代码、业务逻辑代码、数据请求代码等等都集中在其中。
第二种常见的问题是架构实现的不断变化,不断在各种架构间摇摆,一直找不到一个适合自己的架构。
google在官方示例中给出了一系列不同架构的app实现
一、项目介绍
项目名称:android-architecture
项目地址为:https://github.com/googlesamples/android-architecture
项目目的:项目目的是通过展示各种架构app的不同方式来帮助开发者解决架构问题。项目中通过不同的架构概念及方式实现了功能相同的app。你可以用示例来当做参考,或是干脆拿来当做创建app项目的基础。项目中,希望大家能把关注点集中到代码结构、整体架构、可测试性、可维护性这四个方面。当然实现app有很多种方式,千万不要把它当做定式。
已经完成的项目示例:
todo-mvp(mvp基础架构示例)
todo-mvp-clean(基于mvp基础架构项目,使用了clean架构的概念)
todo-mvp-dagger(基于mvp基础架构项目,使用了dagger2进行依赖注入)
todo‑mvp‑rxjava
todo‑mvvm‑databinding
todo‑mvvm‑live
项目选择:这个还是需要开发者自己来做决定,每个项目的说明文件中都说明了该实现的特性。app规模、团队状况、维护工作量的大小、平板是否支持、代码简洁程度偏好,这些都会影响你的选择。
二、项目说明——todo-mvp
MVP是一种思想,并不是一种代码组织形式:
平时用到较多的一种组织方式是按照类型,比如按照activity、adapter、fragment、contract、presenter等进行划分,不同的类文件分别放到不同的目录中,两种方式没有什么太大的区别,完全看个人喜好。如
todo-mvp项目的src目录的代码组织方式完全是按照功能来组织的,功能内部分为xactivity、xcontract、xfragment、xpresenter四个类文件(x代表业务名称),如下。
todoapp
|
|——App
| |
| |——jniLibs
| | |
| | |——armeabi
| | | ——nativelib.so
| | |
| | |...
| |
| |——libs
| |
| |——src
| | |——main
| | | |——java
| | | | |
| | | | |——com.example.android.architecture.blueprints.todoapp(包名)
| | | | | |
| | | | | |
| | | | | |(model层实现:项目中model层最大的特点是被赋予了数据获取的职责,与我们平常model层只定义实体对象截然不同,实例中,数据的获取、存储、数据状态变化都是model层的任务,
| | | | | |presenter会根据需要调用该层的数据处理逻辑并在需要时将回调传入。这样model、presenter、view都只处理各自的任务,此种实现确实是单一职责最好的诠释)
| | | | | |
| | | | | |——data(仓库,用于存本地和远程存储数据)
| | | | | | |——source
| | | | | | | |——remote
| | | | | | | |——local
| | | | | | | |
| | | | | | | ......
| | | | | |
| | | | | |
| | | | | |
| | | | | |——XXTask1
| | | | | | |——activity(activity在项目中是一个全局的控制者,负责创建view以及presenter实例,并将二者联系起来)
| | | | | | |——fragment(将fragment作为view层的实现类,第一个原因是我们把activity作为一个全局控制类来创建对象,把fragment作为view,这样两者就能各司其职。
| | | | | | | 第二个原因是因为fragment比较灵活,能够方便的处理界面适配的问题)
| | | | | | |——presenter(presenter构造函数中调用了view得setPresenter方法将自身实例传入,start方法中处理了数据加载与展示。如果需要界面做对应的变化,直接调用view层的方法即可。)
| | | | | | |——Contract(契约类:用来统一管理view与presenter的所有的接口定义)
| | | | | |
| | | | | |
| | | | | |——XXTask2
| | | | | | |——activity
| | | | | | |——fragment
| | | | | | |——presenter
| | | | | | |——Contract(契约类:用来统一管理view与presenter的所有的接口定义)
| | | | | |
| | | | | |
| | | | | |(BasePresenter与BaseView,两类分别是所有Presenter与View的基类。)
| | | | | |——BasePresenter(BasePresenter中含有方法start(),该方法的作用是presenter开始获取数据并调用view中方法改变界面显示,其调用时机是在Fragment类的onResume方法中。)
| | | | | |——BaseView(BaseView中含方法setPresenter,该方法作用是在将presenter实例传入view中,其调用时机是presenter实现类的构造函数中)
| | | | | |
| | | | | |
| | | | | |——util
| | | | | |
| | | | | |......
| | | |
| | | |
| | | |
| | | |——res
| | | |
| | | |——AndroidManifest.xml
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |——androidTest (UI层测试)
| | |
| | |
| | |——androidTestMock (UI层测试mock数据支持)
| | |
| | |
| | |——mock (业务层单元测试mock数据支持)
| | |
| | |
| | |——test (业务层单元测试)
| | |
| |
| |
| |
| |——xxx.keystore
| |
| |——build.gradle
| |
| |......
|
|
|——library
| |——build.gradle
| |——...
|
|——build.gradle
|
|——settings.gradle