1、概述

传统的Android开发架构通常是MVC模式。

  • Model:业务逻辑和实体模型
  • View:相应于布局文件
  • Controllor:相应于Activity

单独从逻辑看起来很好,与我们做Web开发时,开发模式相似,但在实际开发中。View相应于布局文件,实际上关于该布局文件里的数据绑定的操作,事件处理的代码都在Activity中,Activity既像View又像Controller(MVVP架构中包含数据绑定)。导致Activity中职责太重。耦合度大。改动和维护起来很麻烦。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenRjaHVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

2、MVP介绍

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenRjaHVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

MVP架构中,View 相应于Activity,负责View的绘制以及与用户交互

Model 依旧是业务逻辑和实体模型,Presenter 负责完毕View于Model间的交互。

(1)Model层

模型层之中做的工作是详细业务逻辑处理的实现,都伴随着程序中各种数据的处理,复杂一些的就须要实现一个Interface来松耦合了。

(2)View层

视图层体现的很轻薄。负责显示数据、提供友好界面跟用户交互即可。

MVP下Activity和Fragment体如今了这一 层,Activity一般也就做载入UI视图、设置监听再交由Presenter处理的一些工作。所以也就须要持有相应Presenter的引用。

处理一些基本UI逻辑。推断是否为空。

(3)Presenter层

Presenter这一层处理着程序各种逻辑的分发,收到View层UI上的反馈命令、定时命令、系统命令等指令后分发处理逻辑交由Model层做详细的业务操作。

MVP架构和MVC架构差别:

MVC中是同意Model和View进行交互的,而MVP中,Model与View之间的交互由Presenter完毕。另一点就是Presenter与View之间的交互是通过接口的。

3、MVP实现

百说不如一做。实现一个简单的登录操作。

项目结构例如以下:

(1)Model层实现

首先实现User实体类:

package com.chunsoft.blogcontent.bean;

/**
* Developer:chunsoft on 2017/2/7 11:19
* Email:chun_soft@qq.com
* Content:实体类
*/ public class User { private String username;
private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

model层主要实现业务逻辑处理,在本文案例中,主要逻辑处理就是登录,抽取了一个接口和一个实现类,在login操作,模拟登录操作,Thread.sleep()模拟耗时。因为是耗时操作,通过一个回调接口通知登录状态。

model层接口:

package com.chunsoft.blogcontent.model;

import com.chunsoft.blogcontent.RequestCallback;
import com.chunsoft.blogcontent.bean.User; /**
* Developer:chunsoft on 2017/2/7 11:30
* Email:chun_soft@qq.com
* Content:Model层主要处理业务方法和实体模型
*/ public interface LoginModel {
void login(String username, String password, RequestCallback<User> callback);
}

model层接口实现:

package com.chunsoft.blogcontent.model.impl;

import com.chunsoft.blogcontent.RequestCallback;
import com.chunsoft.blogcontent.bean.User;
import com.chunsoft.blogcontent.model.LoginModel; /**
* Developer:chunsoft on 2017/2/7 11:31
* Email:chun_soft@qq.com
* Content:Model层的实现
*/ public class LoginModelImpl implements LoginModel{
@Override
public void login(final String username, final String password, final RequestCallback<User> callback) {
//模仿登录操作
new Thread() {
@Override
public void run() {
try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if ("chunsoft".equals(username) && "123456".equals(password)) {
User user = new User();
user.setUsername(username);
user.setPassword(password);
callback.onSuccess(user);
} else {
callback.onFailure("登录失败");
}
}
}.start();
}
}

回调接口:

package com.chunsoft.blogcontent;

/**
* Developer:chunsoft on 2017/2/7 11:35
* Email:chun_soft@qq.com
* Content:回调接口
*/ public interface RequestCallback<T> {
void onSuccess(T datas);
void onFailure(String msg);
}

(2)View层实现

对于View层接口定义,首先考虑功能上的操作,然后考虑:

  • 该操作须要什么?(getUserName等)
  • 该操作的结果。相应的反馈?(toMainActivity等)
  • 该操作过程中交互友好?( showLoading)

view层接口:

package com.chunsoft.blogcontent.view;

import com.chunsoft.blogcontent.bean.User;

/**
* Developer:chunsoft on 2017/2/7 11:54
* Email:chun_soft@qq.com
* Content:view层接口
*/ public interface LoginView {
String getUserName();
String getPassword(); void showLoading();
void hideLoading(); void toMainActvity(User user);
void showFailedError(String msg);
}

view层实现,事实上就是Activity,能够看到Activity的代码量大大降低,且逻辑清晰:

package com.chunsoft.blogcontent;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast; import com.chunsoft.blogcontent.bean.User;
import com.chunsoft.blogcontent.presenter.impl.LoginPresenterImpl;
import com.chunsoft.blogcontent.view.LoginView; public class MainActivity extends AppCompatActivity implements LoginView{ private EditText et_mobile,et_password;
private ProgressBar pb;
private Button btn_login; private LoginPresenterImpl mLoginPresenter = new LoginPresenterImpl(this); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_mobile = (EditText) findViewById(R.id.et_mobile);
et_password = (EditText) findViewById(R.id.et_password);
pb = (ProgressBar) findViewById(R.id.pb);
btn_login = (Button) findViewById(R.id.btn_login); btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mLoginPresenter.login();
}
});
} @Override
public String getUserName() {
return et_mobile.getText().toString();
} @Override
public String getPassword() {
return et_password.getText().toString();
} @Override
public void showLoading() {
pb.setVisibility(View.VISIBLE);
} @Override
public void hideLoading() {
pb.setVisibility(View.INVISIBLE);
} @Override
public void toMainActvity(User user) {
Toast.makeText(this,user.getUsername() + "登录成功",Toast.LENGTH_SHORT).show();
} @Override
public void showFailedError(String msg) {
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
}

(3)Presenter层实现

Presenter层是Model层和View层的桥梁。本文中依旧抽象出一个接口和一个实现类,定义时主要看该功能有什么操作,比如。登录:

Presenter接口:

package com.chunsoft.blogcontent.presenter;

/**
* Developer:chunsoft on 2017/2/7 11:49
* Email:chun_soft@qq.com
* Content:Presenter层接口
*/
public interface LoginPresenter {
void login();
}

Presenter层实现:

package com.chunsoft.blogcontent.presenter.impl;

import android.os.Handler;

import com.chunsoft.blogcontent.RequestCallback;
import com.chunsoft.blogcontent.bean.User;
import com.chunsoft.blogcontent.model.LoginModel;
import com.chunsoft.blogcontent.model.impl.LoginModelImpl;
import com.chunsoft.blogcontent.presenter.LoginPresenter;
import com.chunsoft.blogcontent.view.LoginView; /**
* Developer:chunsoft on 2017/2/7 11:50
* Email:chun_soft@qq.com
* Content:Presenter层实现
*/ public class LoginPresenterImpl implements LoginPresenter { private LoginView loginView;
private LoginModel loginModel; private Handler mHandler = new Handler(); //在构造函数中初始化
public LoginPresenterImpl(LoginView loginView) {
this.loginModel = new LoginModelImpl();
this.loginView = loginView;
} @Override
public void login() {
loginView.showLoading();
loginModel.login(loginView.getUserName(), loginView.getPassword(), new RequestCallback<User>() {
@Override
public void onSuccess(final User datas) {
//登录成功
mHandler.post(new Runnable() {
@Override
public void run() {
loginView.toMainActvity(datas);
loginView.hideLoading();
}
});
} @Override
public void onFailure(final String msg) {
//登录失败
mHandler.post(new Runnable() {
@Override
public void run() {
loginView.showFailedError(msg);
loginView.hideLoading();
}
});
}
});
}
}

Presenter层是Model层和View层的桥梁,Model层和View层不直接通信。所以Presenter层须要Model层和View层的实现类。从View层中获取重要參数,交给Model 层调用业务逻辑处理,运行后的结果和反馈再交给View层去展示。

本文源代码下载

本文是简单的用MVP架构实现登录操作,而眼下主流开发,将Rxjava、Retrofit和MVP结合进行开发,逻辑更加清晰,下篇文章将详细介绍这部分实现。

Android中的MVP架构分解和实现的更多相关文章

  1. Android中的MVP架构初探

    说来羞愧,MVP的架构模式已经在Android领域出现一两年了.可是到今天自己才開始Android领域中的MVP架构征程. 闲话不多说,開始吧. 一.架构演变概述 我记得我找第一份工作时,面试官问我& ...

  2. 转:Android开发中的MVP架构(最后链接资源不错)

    Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...

  3. 转: Android开发中的MVP架构详解(附加链接比较不错)

    转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...

  4. 设计模式笔记之二:Android开发中的MVP架构(转)

    写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...

  5. Android 中的MVP 模式

    MVP模式的核心思想: MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成功接口,Model类还是原来的Model. MVC 其中View层其实就是程序的UI界面,用于向用户展示 ...

  6. android中的MVP模式

    1.建立bean public class UserBean { private String mFirstName; private String mLastName; public UserBea ...

  7. Android中的四层架构,五块区域

    1. Linux内核层Android系统是基于Linux 2.6内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动.音频驱动.照相机驱动.蓝牙驱动.Wi-Fi驱动.电源管理等.2 ...

  8. ReadHub项目Kotlin版开发指南(三、MVP架构)

    ReadHub项目Kotlin版转换指南(一.环境搭建) ReadHub项目Kotlin版转换指南(二.数据库和网络请求) ReadHub项目Kotlin版转换指南(三.MVP架构) Android ...

  9. Android中关于Handler的若干思考

    在之前的博文中,讲过一些和Handler有关的知识,例如: Android 多线程----AsyncTask异步任务详解 Android多线程----异步消息处理机制之Handler详解 今天再把Ha ...

随机推荐

  1. jqPlot图表插件学习之柱形图和旋转分类名称

    一.准备工作 首先我们需要到官网下载所需的文件: 官网下载(笔者选择的是jquery.jqplot.1.0.8r1250.zip这个版本) 然后读者需要根据自己的情况新建一个项目并且按照如下的方式加载 ...

  2. selenium 定制启动 chrome 的选项

    序 使用 selenium 时,我们可能需要对 chrome 做一些特殊的设置,以完成我们期望的浏览器行为,比如阻止图片加载,阻止JavaScript执行 等动作.这些需要 selenium的 Chr ...

  3. 老古董---ASP.NET中aspx页面runat="server"

    自从 mvc3 被广泛的推进生产环境后,这个runat="server" 慢慢被人遗忘了... asp.net 的 webForm 基于控件的 html  渲染过程是否还记得呢?是 ...

  4. Linux中svn的使用

    1. 安装Linux 执行如下命令,中间会出现一次提示,选y即可 yum install subversion 2. 创建资源库位置 svnadmin create /usr/java/testJen ...

  5. SSD基本工作原理

    SSD主要由SSD控制器,FLASH存储阵列,板上DRAM(可选),以及跟HOST接口(诸如SATA,SAS, PCIe等)组成. SSD主控通过若干个通道(channel)并行操作多块FLASH颗粒 ...

  6. ios实例开发精品文章推荐(8.12)11个处理触摸事件和多点触摸的JS库

    11个处理触摸事件和多点触摸的JS库 触摸屏是现在所有智能手机的标配,还包括各种平板设备,而且很多桌面也慢慢在开始支持触摸操作.要开发支持触摸屏设备的Web应用,我们需要借助浏览器的触摸事件来实现. ...

  7. rabbitMQ概念详细介绍

    1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...

  8. >/dev/null 2>&1的含义

    转帖:http://www.cnblogs.com/dkblog/archive/2009/07/31/1980722.html os.system("/etc/init.d/winbind ...

  9. 根据自身经验总结的一个IT时间管理

      2012-11-13 内容存档在evernote,笔记名"根据自身经验总结的一个IT时间管理"

  10. HDU 4638 Group (线段树 | 树状数组 + 离线处理)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...