MVP
(Model-View-Presenter)软件设计架构在Android开发中能够帮助我们将业务逻辑和视图展现解耦,便于代码的维护,达到模块化.这个系列我会带大家完成一个完整的MVP
架构的应用,希望大家通过这个系列能到MVP
架构有个基本的了解.
MVP具体是如何工作
在我们编码开发时,我们将系统分为数据模型(Model
),视图(View
),和一个”中间人”(Presenter
)三个部分.其中Presenter
作为一个”中间人”,它从Model
中获取数据,将数据进行相应的处理后将数据交给View
进行展示.这样一来,View
只需展现数据给用户看,其它的事情它就不用管了,而Model
只需完成数据的请求处理,其它的事情它也不用管,Presenter
则负责从Model
获取数据,通知View
进行数据更新.
Android开发中的MVP
首先我们先了解一下各个模块的具体职责:
- Model
- 对外提供业务数据的接口
- 实现数据的存取操作(本地与网络)
- 只有
Presenter
可以访问,与View
隔离
- Presenter
- 持有
View
对象,可对View
进行操作 - 持有
Model
提供的数据访问接口 - 从数据接口中获取数据并处理,更新
View
- 持有
- View
- 包含UI的相关组件
- 持有
Presenter
对象 - 由
Presenter
负责更新UI 在Android中采用MVP
架构可以大大的减轻Activity
的职责,下面我将采用一个简单的例子来介绍一下MVP
在Android开发中是如何使用的.
我们使用豆瓣的电影Top250来进行讲解,为简单起见,我们使用用Retrofit
进行网络数据的请求,使用Glide
进行图片加载.如果对Retrofit
和Glide
的使用不了解的话,可以看一下我的另外两篇文章:
Android学习笔记—开源工具Retrofit的基本使用
Android学习笔记—开源工具Glide的基本使用
准备工作
数据准备
我们的数据是来自豆瓣电影Top250的API,请求的URL如下:其中
start
表示从电影起始的下标,count
表示要获取电影的数量.依赖配置
我们的项目的Gradle
依赖配置如下:
app/build.gradleapply plugin: 'com.android.application' apply plugin: 'android-apt' android { compileSdkVersion 23 buildToolsVersion "24.0.0 rc3" defaultConfig { applicationId "com.source.kevin.doubantop250" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.android.support:recyclerview-v7:23.4.0' compile 'com.android.support:cardview-v7:23.4.0' compile 'com.jakewharton:butterknife:8.0.1' apt 'com.jakewharton:butterknife-compiler:8.0.1' }
项目根目录下的
build.gradle
:buildscript { repositories { mavenCentral() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.0.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } } allprojects { repositories { jcenter() } } repositories{ mavenLocal() mavenCentral() } task clean(type: Delete) { delete rootProject.buildDir }
界面设计
我们最后完成的界面是一个瀑布流的电影图片与标题的一个主界面,因为我是边写代码边写博客的,所以App的界面效果还没法给大家展示,但我们最后的界面会类似下面的壁纸应用效果图:
所有的准备工作都做好了,下次我们会把项目的MVP
架构搭建起来.