【FastDev4Android框架开发】Android MVP开发模式详解(十九)

转载请标明出处:

http://blog.csdn.net/developer_jiangqq/article/details/49613861

本文出自:【江清清的博客】

(一).前言:

今天我们的项目继续更新,今天我们主要讲解MVP开发模式以及具体实例。

FastDev4Android框架项目地址:https://github.com/jiangqqlmj/FastDev4Android

(二).简介:

MVP(Model ViewPresenter)模式是著名的MVC(Model ViewController)模式的一个演化版本,目前它在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模式例子讲解:

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

4.2.例子实例如下:

4.3.项目代码框架如下:

4.4.代码具体实现:

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

packagecom.chinaztt.fda.entity;

/**
 * 当前类注释:用户信息实体类
 * 项目名:FastDev4Android
 * 包名:com.chinaztt.fda.entity
 * 作者:江清清 on 15/10/27 14:13
 * 邮箱:[email protected]
 * QQ: 781931404
 * 公司:江苏中天科技软件技术有限公司
 */
public classPersonBean {
    private String username;
    private String password;

    public PersonBean() {
    }

    public PersonBean(String username, Stringpassword) {
        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 interfaceIPersonBiz {
    void login(String username,Stringpassword,LoginRequestCallBack valueCallBack);
}
packagecom.chinaztt.fda.biz.imp;

importcom.chinaztt.fda.biz.IPersonBiz;
importcom.chinaztt.fda.biz.LoginRequestCallBack;
importcom.chinaztt.fda.entity.PersonBean;
importcom.chinaztt.fda.utils.Log;

/**
 * 当前类注释:用户相关业务逻辑实现类
 * 项目名:FastDev4Android
 * 包名:com.chinaztt.fda.biz.imp
 * 作者:江清清 on 15/10/27 16:33
 * 邮箱:[email protected]
 * QQ: 781931404
 * 公司:江苏中天科技软件技术有限公司
 */
public classPersonBizImp 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 (InterruptedExceptione) {
                    e.printStackTrace();
                }
                //进行开始登录,这边应该进行请求服务器,进行数据验证
               if(username.equals("jiangqq")&&password.equals("12345")){
                   valueCallBack.loginSuccess(new PersonBean(username,password));
                }else{
                   valueCallBack.loginFailed();
                }
            }
        }).start();
    }
}
packagecom.chinaztt.fda.biz;

importcom.chinaztt.fda.entity.PersonBean;
/**
 * 当前类注释:登录请求结果回调
 * 项目名:FastDev4Android
 * 包名:com.chinaztt.fda.biz
 * 作者:江清清 on 15/10/27 19:50
 * 邮箱:[email protected]
 * QQ: 781931404
 * 公司:江苏中天科技软件技术有限公司
 */
public interfaceLoginRequestCallBack {
    //登录成功回调方法
    void loginSuccess(PersonBean personBean);
    //登录失败回调方法
    void loginFailed();
}

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

packagecom.chinaztt.fda.ui.view;

importcom.chinaztt.fda.entity.PersonBean;

/**
 * 当前类注释:登录页面 相关操作 功能接口
 * 项目名:FastDev4Android
 * 包名:com.chinaztt.fda.ui.view
 * 作者:江清清 on 15/10/27 16:35
 * 邮箱:[email protected]
 * QQ: 781931404
 * 公司:江苏中天科技软件技术有限公司
 */
public interfaceILoginView {
    //获取用户名
    String getUserName();
    //获取密码
    String getPassword();

    void showSuccessInfo(PersonBeanpersonBean);
    void showFailedInfo();
}

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

packagecom.chinaztt.fda.test;

importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.EditText;

importcom.chinaztt.fda.entity.PersonBean;
importcom.chinaztt.fda.presenter.LoginPresenter;
importcom.chinaztt.fda.ui.R;
importcom.chinaztt.fda.ui.base.BaseActivity;
importcom.chinaztt.fda.ui.view.ILoginView;
importcom.chinaztt.fda.utils.Log;

importorg.androidannotations.annotations.EActivity;

/**
 * 当前类注释:MVP开发模式实例
 * 项目名:FastDev4Android
 * 包名:com.chinaztt.fda.test
 * 作者:江清清 on 15/10/27 13:38
 * 邮箱:[email protected]
 * QQ: 781931404
 * 公司:江苏中天科技软件技术有限公司
 */
@EActivity
public classMVPTestActivity 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(BundlesavedInstanceState) {
        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=newLoginPresenter(this);
        btn_login.setOnClickListener(newView.OnClickListener() {
            @Override
            public void onClick(View v) {
                mLoginPresenter.loginSystem();

            }
        });
    }
    /**
     * 进行返回用户名信息
     * @return
     */
    @Override
    public String getUserName() {
        returned_username.getText().toString().trim();
    }
    /**
     * 进行返回用户密码信息
     * @return
     */
    @Override
    public String getPassword() {
        returned_password.getText().toString().trim();
    }
    /**
     * 登录成功 回调
     * @param personBean
     */
    @Override
    public void showSuccessInfo(PersonBeanpersonBean) {
       Log.d(TAG,"showSuccessInfo:"+personBean.toString());
       showToastMsgShort("登录成功:"+personBean.toString());
    }
    /**
     * 登录失败 回调
     */
    @Override
    public void showFailedInfo() {
       Log.d(TAG,"showFailedInfo...");
       showToastMsgShort("登录失败...");
    }
}

最后还少一个交互桥梁Presenter:

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

packagecom.chinaztt.fda.presenter;

importandroid.os.Handler;

importcom.chinaztt.fda.biz.IPersonBiz;
importcom.chinaztt.fda.biz.LoginRequestCallBack;
importcom.chinaztt.fda.biz.imp.PersonBizImp;
importcom.chinaztt.fda.entity.PersonBean;
importcom.chinaztt.fda.ui.view.ILoginView;
importcom.chinaztt.fda.utils.Log;

/**
 * 当前类注释:负责完成登录界面View于Model(IPersonBiz)间的交互
 * 项目名:FastDev4Android
 * 包名:com.chinaztt.fda.presenter
 * 作者:江清清 on 15/10/27 16:36
 * 邮箱:[email protected]
 * QQ: 781931404
 * 公司:江苏中天科技软件技术有限公司
 */
public classLoginPresenter {
    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(), newLoginRequestCallBack() {
           /**
            * 登录成功
            * @param personBean
            */
           @Override
           public void loginSuccess(finalPersonBean 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了。

我们的项目已经配置集成了MVPDemo的例子.欢迎大家去Github站点进行clone或者下载浏览:https://github.com/jiangqqlmj/FastDev4Android 同时欢迎大家star和fork整个开源快速开发框架项目~

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-25 23:16:00

【FastDev4Android框架开发】Android MVP开发模式详解(十九)的相关文章

优佳贝开发优佳贝模式详解

优佳贝开发优佳贝模式详解(微or电 158.1500.1390 小凡团队)优佳贝系统开发,优佳贝模式定制,优佳贝软件开发,优佳贝app开发,优佳贝模式系统开发. 互联网颠覆了传统的商业模式,创造了庞大的商业机遇,更改变了世界财富的分配定律!互联网已经无国界,已经引申到世界每一个角落.互联网与电子商务的结合,必将创造一个又一个新奇迹!在历史发展的当今世界.21世纪,整个世界经济发生了巨大的变化!21世纪更是一个移动互联网经济占据鳌头的市场!谁抓住了互联网市场趋向谁就抓住了,在互联网一体化的今天,信

Android中launchMode模式详解

关于Android中launchMode的文章介绍的真心不少,广为流传而且介绍的最详细的莫过于这篇文章http://blog.csdn.net/android_tutor/article/details/6310015.但是这篇文章中关于singletask和singleinstance在评论中还是有些不解和争论,在此根据实例重点说下这两种模式: 实例简介:有两个Activity,分别为AActivity和BActivity,界面相同.点击按钮A和B,分别启动AActivity和BActivit

易商城系统模式开发易商城系统模式详解

易商城系统开发(李想.185.6504.8478)商业兴起于先商时期的商国,形成初期是以物换物的方式进行的社会活动.后来发展成为以货币为媒介进行交换从而实现商品流通的经济活动.现代的商业分为线下以及线上两种,极大提高了贸易的效率.以买卖方式使商品流通的经济活动.小编来给大家介绍一下易商城系统的具体细节: 易商城,一个新兴的商业模式(模式简介) 股权部分: 100元/股(每人只能投资一股,后期可用股权部分产生的收益进行复投) 1.静态分红: 每日返10元,返到150出局1股. 每位会员只能投入1股

O2O商城系统开发O2O商城系统模式详解

O2O商城网站系统开发(李想.185.6504.8478)O2O商城系统是什么?O2O商城系统有什么用?我为什么要买O2O商城系统?O2O商城系统到底能给我解决什么问题?如果你想了解具体,那么就请跟随小编了解O2O商城系统!O2O并未颠覆传统企业,其实O2O模式并没有真正意义上的颠覆,而是行业升级.O2O的核心使命是把传统企业原来落后.固有的商业手段和作业手段进行信息化的武装,全面地提升行业信息化水平.从这个意义上讲O2O做的不是电子商务,而是商务电子化.虽然传统的商业模式存在已久,已经在人们心

喵爪折扣商城系统开发淘宝客模式详解

喵爪折扣商城系统开发(苏铭.188.1414.7927)喵爪折扣平台开发,喵爪折扣商城开发,喵爪折扣网站开发,喵爪折扣app开发,喵爪折扣淘宝客模式开发.猛然间发现,"互联网思维"一词已经被各种吐槽.因为每个人的思考出发点和理解深度不同,所以认知有分歧不足为奇.但是,互联网思维作为一种思考方式,能够遭到这么多评论,也真是蔚为大观了. 我在之前的一篇演讲稿中已经对互联网思维有了初步的阐述,没读过的请百度"互联网思维独孤九剑".近期发生的很多事也不断地刺激我更进一步的思

店员激励系统开发店员激励系统模式详解

店员激励系统开发(李想.185.6504.8478)店员激励系统是什么?店员激励系统有什么用?我为什么要购买店员激励系统?店员激励系统可以解决什么问题?又可以实现什么?激励也是人力资源的重要内容,是指激发人的行为的心理过程.激励这个概念用于管理,是指激发员工的工作动机,也就是说用各种有效的方法去调动员工的积极性和创造性,使员工努力去完成组织的任务,实现组织的目标.有效的激励会点燃员工的激情,促使他们的工作动机更加强烈,让他们产生超越自我和他人的欲望,并将潜在的巨大的内驱力释放出来,为企业的远景目

智慧酒店系统开发智慧酒店系统模式详解

智慧酒店系统开发(李想.185.6504.8478)智慧酒店系统是什么?智慧酒店系统有什么用?我为什么要购买智慧酒店系统?智慧酒店系统又能解决什么问题?如果你对这些感兴趣,那么你一定要对智慧酒店系统有一定的了解!从感觉到记忆到思维这一过程,称为"智慧",智慧的结果就产生了行为和语言,将行为和语言的表达过程称为"能力",两者合称"智能",将感觉.记忆.回忆.思维.语言.行为的整个过程称为智能过程,它是智力和能力的表现.它们分别又可以用"智

匀加速系统模式开发匀加速系统模式详解

匀加速系统开发(李想.185.6504.8478)物体运动过程中,其速度的变化量与发生这一变化所用时间的比值称为加速度(用a表示).若一物体沿直线运动,且在运动的过程中加速度保持不变,则称这一物体在做匀加速直线运动.它的加速度为某一个常值,当这个常值恒为零时就变为匀速直线运动或静止.可以说匀速直线运动是匀加速直线运动的特殊情况.但是在中学考试中,一般不把匀速直线运动当作匀加速直线运动.看来小编有必要给大伙们简介一下匀加速系统的大致内容. 一.匀加速系统是什么? 匀加速采用"020+F2C+会员制

让利宝系统模式开发让利宝系统模式详解

让利宝系统开发(李想.185.6504.8478)利益是指人类用来满足自身欲望的一系列物质.精神需求的产品,某种程度上来说,包括:金钱.权势.色欲.荣誉.名气.国家地位.领土.主权乃至于帮助他人所带来的快感,但凡是能满足人类欲望的事物,均可称为利益.利益依附欲望而生,而人的基因确定了欲望的存在,组成社会的基本元素是人,就不可避免地出现了:阶级.既得利益者.阶级矛盾.政治.战争--利益冲突决定着一切.小编要向大家解释一下让利宝系统的基础内容! 让利宝模式解析:对于商家:传统的商业模式,商家为了吸引