详解Android MVP开发模式

 更新时间:2016年01月15日 17:20:36   作者:Sky、清  
这篇文章主要为大家介绍了Android MVP开发模式的相关资料,需要的朋友可以参考下

本文主要讲解MVP开发模式以及具体实例。

一、简介

MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了。初看起来我们会感觉增加了很多类接口代码看起来更加清晰。

MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面。不过MVP不是一个结构化的模式,它只是负责显示层而已,任何时候都可以在自己的项目结构中使用MVP模式。(不局限于Android项目开发)

因为MVP其实就是从MVC模式演化产生的,那么我们先看一下著名的MVC模式:

  •       View:对应于布局文件
  •       Model:业务逻辑和实体模型
  •      Controller:控制器,Android中对应于Activity

对应的交互图如下:

虽然Android系统应用开发本身是遵循MVC开发模式的,但是我们仔细看一下View层和Activity,具体view布局文件中的数据绑定和事件处理的方法代码都是冗余在Activity中的,所以我们经常看可以看到Activity类动不动就是少则九百行,多则上千甚至几千行。那么现在的演化升级版本的MVP的模式又是怎么样的呢?MVP模式会引入  Presenter层,该机型复杂完成View层和Model层的交互,那么具体MVP对应如下:

  •       View:View通常来说是由Activity实现的,它会包含一个Presenter的引用,View要做的就只是在每次有接口调用的时候(比如按钮点击后)调用Presenter的方法。
  •        Model:业务逻辑和实体模型
  •       Presenter:主要作为沟通View和Model的桥梁,它从Model层检索数据后,返回给View层,但是不像MVC结构,因为它也可以决定与View层的交互操作。

数据交互图如下:

观察上面两个模式的交互图,是不是MVP模式更加清晰简单啊!

二、MVC和MVP区别

我们来具体看一下下面两张对比,就可以看来具体区别了:

观察上图我们可以发现MVP模式中,View 和Model的交互是通过Presenter来进行完成,这样统一管理,逻辑会更加清晰。

三、MVP模式例子讲解

3.1.具体实现功能需求:我们是用MVP模式来进行实现用户登录操作.

3.2.例子实例如下:

3.3.项目代码框架如下:

3.4.代码具体实现:

3.4.1.Model层:Bean类(Entity),PersonBean类,然后在业务逻辑类中有登录方法,同时把登录成功状态回调接口传入进入,具体如下:

package com.chinaztt.fda.entity;
/**
* 当前类注释:用户信息实体类
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.entity
*/
public class PersonBean {
private String username;
private String password;
public PersonBean() {
}

public PersonBean(String username, String password) {
this.username = username;
this.password = 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;
}

@Override
public String toString() {
return "PersonBean{" +
"username='" + username + '\'' +
", password='" + password + '\'' +

'}';
}
}



public interface IPersonBiz {
void login(String username,String password,LoginRequestCallBack valueCallBack);

package com.chinaztt.fda.biz.imp;
import com.chinaztt.fda.biz.IPersonBiz;
import com.chinaztt.fda.biz.LoginRequestCallBack;
import com.chinaztt.fda.entity.PersonBean;
import com.chinaztt.fda.utils.Log;
/**
* 当前类注释:用户相关业务逻辑实现类
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.biz.imp
*/
public class PersonBizImp implements IPersonBiz{
private static final String TAG="PersonBizImp";
@Override
public void login(final String username, final String password, final LoginRequestCallBack valueCallBack) {
Log.d(TAG,"username:"+username+",password:"+password);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(4500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//进行开始登录,这边应该进行请求服务器,进行数据验证
if(username.equals("jiangqq")&&password.equals("12345")){
valueCallBack.loginSuccess(new PersonBean(username,password));
}else{
valueCallBack.loginFailed();
}
}
}).start();
}
}

package com.chinaztt.fda.biz;
import com.chinaztt.fda.entity.PersonBean;
/**
* 当前类注释:登录请求结果回调
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.biz
*/
public interface LoginRequestCallBack {
//登录成功回调方法
void loginSuccess(PersonBean personBean);
//登录失败回调方法
void loginFailed();
}

3.4.2.View层:该通过Presenter与View进行交互,这边需要定义一个接口ILoginView:

package com.chinaztt.fda.ui.view;
import com.chinaztt.fda.entity.PersonBean;
/**
* 当前类注释:登录页面 相关操作 功能接口
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.ui.view
*/
public interface ILoginView {
//获取用户名
String getUserName();
//获取密码
String getPassword();

void showSuccessInfo(PersonBean personBean);
void showFailedInfo();
}

有了上面的接口之后,我们就需要写我们的实现类Activity了,就非常简单了

package com.chinaztt.fda.test;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.chinaztt.fda.entity.PersonBean;
import com.chinaztt.fda.presenter.LoginPresenter;
import com.chinaztt.fda.ui.R;
import com.chinaztt.fda.ui.base.BaseActivity;
import com.chinaztt.fda.ui.view.ILoginView;
import com.chinaztt.fda.utils.Log;
import org.androidannotations.annotations.EActivity;
/**
* 当前类注释:MVP开发模式实例
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.test
*/
@EActivity
public class MVPTestActivity extends BaseActivity implements ILoginView{
private static final String TAG="MVPTestActivity";
private EditText ed_username;
private EditText ed_password;
private Button btn_login;
private LoginPresenter mLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mvp_test_layout);
ed_username=(EditText)this.findViewById(R.id.ed_username);
ed_password=(EditText)this.findViewById(R.id.ed_password);
btn_login=(Button)this.findViewById(R.id.btn_login);
mLoginPresenter=new LoginPresenter(this);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mLoginPresenter.loginSystem();
}
});
}
/**
* 进行返回用户名信息
* @return
*/
@Override
public String getUserName() {
return ed_username.getText().toString().trim();
}
/**
* 进行返回用户密码信息
* @return
*/
@Override
public String getPassword() {
return ed_password.getText().toString().trim();
}
/**
* 登录成功 回调
* @param personBean
*/
@Override
public void showSuccessInfo(PersonBean personBean) {
Log.d(TAG,"showSuccessInfo:"+personBean.toString());
showToastMsgShort("登录成功:"+personBean.toString());
}
/**
* 登录失败 回调
*/
@Override
public void showFailedInfo() {
Log.d(TAG,"showFailedInfo...");
showToastMsgShort("登录失败...");
}
}

最后还少一个交互桥梁Presenter:
3.4.3.Presenter层:作为Model和View之间的交互桥梁,在本例中进行执行登录操作,然后去Model业务中执行登录,最后把登录结果信息返回给View层,就是这么简单:

package com.chinaztt.fda.presenter;
import android.os.Handler;
import com.chinaztt.fda.biz.IPersonBiz;
import com.chinaztt.fda.biz.LoginRequestCallBack;
import com.chinaztt.fda.biz.imp.PersonBizImp;
import com.chinaztt.fda.entity.PersonBean;
import com.chinaztt.fda.ui.view.ILoginView;
import com.chinaztt.fda.utils.Log;
/**
* 当前类注释:负责完成登录界面View于Model(IPersonBiz)间的交互
* 项目名:FastDev4Android
* 包名:com.chinaztt.fda.presenter
*/
public class LoginPresenter {
private static final String TAG="LoginPresenter";
private ILoginView mLoginView;
private IPersonBiz mPersonBiz;
private Handler mHandler=new Handler();
public LoginPresenter(ILoginView view) {
mLoginView = view;
mPersonBiz = new PersonBizImp();
}
public void loginSystem(){
mPersonBiz.login(mLoginView.getUserName(), mLoginView.getPassword(), new LoginRequestCallBack() {
/**
* 登录成功
* @param personBean
*/
@Override
public void loginSuccess(final PersonBean personBean) {
Log.d(TAG, "登录成功:" + personBean.toString());
mHandler.post(new Runnable() {
@Override
public void run() {
mLoginView.showSuccessInfo(personBean);
}
});
}
/**
* 登录失败
*/
@Override
public void loginFailed() {
Log.d(TAG,"登录失败...");
mHandler.post(new Runnable() {
@Override
public void run() {
mLoginView.showFailedInfo();;
}
});
}
});
}
}

到此我们的MVP模式的例子就大体完成了,看一下上面的效果演示就OK了。

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

相关文章

  • Android 实现定时任务的过程详解

    Android 实现定时任务的过程详解

    这篇文章主要介绍了Android 定时任务过程详解的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android悬浮窗按钮实现点击并显示/隐藏多功能列表

    Android悬浮窗按钮实现点击并显示/隐藏多功能列表

    这篇文章主要为大家详细介绍了Android悬浮窗按钮实现点击并显示/隐藏多功能列表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 剖析Android Activity侧滑返回的实现原理

    剖析Android Activity侧滑返回的实现原理

    在很多的App中,都会发现利用手指滑动事件,进行高效且人性化的交互非常有必要,那么它是怎么实现的呢,本文给大家解析实现原理,对Activity侧滑返回实现代码感兴趣的朋友一起看看吧
    2021-06-06
  • Android使用CountDownTimer类实现倒计时闹钟

    Android使用CountDownTimer类实现倒计时闹钟

    这篇文章主要为大家详细介绍了Android使用CountDownTimer类实现倒计时闹钟,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • android 传感器(OnSensorChanged)使用介绍

    android 传感器(OnSensorChanged)使用介绍

    当传感器的值发生变化时,例如磁阻传感器方向改变时会调用OnSensorChanged(). 当传感器的精度发生变化时会调用OnAccuracyChanged()方法
    2014-11-11
  • Input系统按键事件的分发处理示例详解

    Input系统按键事件的分发处理示例详解

    这篇文章主要为大家介绍了Input系统按键事件的分发处理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Kotlin与Java相互调用的完整实例

    Kotlin与Java相互调用的完整实例

    Kotlin的设计过程中就考虑到了与Java的互操作性,在Kotlin中可以直接调用既有的Java代码,反过来在Java中也可以很流畅地使用Kotlin代码,这篇文章主要给大家介绍了关于Kotlin与Java相互调用的相关资料,需要的朋友可以参考下
    2021-12-12
  • Android系统检测程序内存占用各种方法

    Android系统检测程序内存占用各种方法

    这篇文章主要介绍了Android系统检测程序内存占用各种方法,本文讲解了检查系统总内存、检查某个程序的各类型内存占用、检查程序状态、检查程序各部分的内存占用等内容,需要的朋友可以参考下
    2015-03-03
  • Flutter应用框架搭建实现屏幕适配方案详解

    Flutter应用框架搭建实现屏幕适配方案详解

    移动设备多样性,特别是Android的碎片化严重,存在各种各样的分辨率,flutter跨平台开发又需要同时支持Android和IOS,为尽可能的还原设计图效果提升用户的体验,根据设计稿设计屏幕ui的时候我们需要考虑到屏幕适配的问题
    2022-11-11
  • 利用DrawerLayout和触摸事件分发实现抽屉侧滑效果

    利用DrawerLayout和触摸事件分发实现抽屉侧滑效果

    这篇文章主要为大家详细介绍了利用DrawerLayout和触摸事件分发实现抽屉侧滑效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论