android MVP 实践笔记

原创 2016年06月01日 15:08:30

我是这样理解的

首先一个界面先看看需要哪些操作 ,已注册登录为例子
注册界面 一般有获取验证码,和注册的操作。界面上大概就是这几种,获取验证码成功,失败,注册成功失败,显示loading和隐藏而已。
那我就先写个interface -RegistView
RegistView

/**
 * 注册视图
 * Created by wushange on 2016/06/01.
 */
public interface RegistView {
    /**
     * 获取验证码成功
     */
    void OnShowSuccessGetCodeView();

    /**
     * 获取验证码失败
     */
    void OnshowFailGetCodeView();

    /**
     * 注册成功
     *
     * @param user
     */
    void onShowSuccessRegistView(String user);

    /**
     * 注册失败
     */
    void onShowFailedRegistView();


    /**
     * 显示loading
     */
    void showLoadingView();

    /**
     * 隐藏loading
     */
    void dissLoadingView();
}

有了接口就要实现他了,那就简单了,写个manager管理类, 这里面是真正的业务处理,所有的异步操作放在这里执行。比如登录 ,注册,获取验证码。
LoginAndRegistMananger

import com.dmcc.dmcc_crm.bean.User;

import org.xutils.common.util.LogUtil;

/**
 * 业务处理层
 */
public class LoginAndRegistMananger {
    /**
     * 获取验证码回掉
     * 需要什么参数自己添加就可以
     */
    public interface OnGetCodeLisener {
        void getCodeSuccess();
        void getCodeFail();
    }

    /**
     * 注册相关 回掉
     * 需要什么参数自己添加就可以
     */
    public interface OnRegistLisener {
        void registSuccess(String user);
        void registFailed();
    }

    /**
     * 登录相关 回掉
     * 需要什么参数自己添加就可以
     */
    public interface OnLoginListener {
        void loginSuccess(User user);
        void loginFailed();
    }

    public void getCode(final String phone, final OnGetCodeLisener onGetCodeLisener) {

        LogUtil.e("---模拟子线程耗时操作----");
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                LogUtil.e("---  模拟获取验证码成功----");
                onGetCodeLisener.getCodeSuccess();
            }
        }.start();
    }

    public void regist(final String username, final String password, final String code, final OnRegistLisener onRegistLisener) {
        LogUtil.e("---模拟子线程耗时操作----");
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                LogUtil.e("---  模拟注册成功----");
                onRegistLisener.registSuccess("注册成功");
            }
        }.start();
    }


    public void login(final String username, final String password, final OnLoginListener loginListener) {
        LogUtil.e("---模拟子线程耗时操作----");
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                LogUtil.e("---  模拟登录成功----");

                if ("111".equals(username) && "111".equals(password)) {
                    User user = new User();
                    user.setUserName(username);
                    user.setPassword(password);
                    loginListener.loginSuccess(user);
                } else {
                    loginListener.loginFailed();
                }
            }
        }.start();
    }

然后再写个presenter类 这个是activity层 获得数据的(我是这样子理解的)

LoginAndRegistPresenter实现

import com.dmcc.dmcc_crm.bean.User;
import com.dmcc.dmcc_crm.view.LoginView;
import com.dmcc.dmcc_crm.view.RegistView;

/**
 * p层
 */
public class LoginAndRegistPresenter {
    RegistView registView;
    LoginView loginView;
    LoginAndRegistMananger loginAndRegistMananger;

    /**
     * 登陆界面构造器
     *
     * @param loginView
     */
    public LoginAndRegistPresenter(LoginView loginView) {
        this.loginView = loginView;
        this.loginAndRegistMananger = new LoginAndRegistMananger();
    }

    /**
     * 注册界面构造器
     *
     * @param registView
     */
    public LoginAndRegistPresenter(RegistView registView) {
        this.registView = registView;
        this.loginAndRegistMananger = new LoginAndRegistMananger();
    }

    /**
     * 获取验证码
     * @param phone
     */
    public void getCode(String phone) {
        registView.showLoadingView();
        loginAndRegistMananger.getCode(phone, new LoginAndRegistMananger.OnGetCodeLisener() {
            @Override
            public void getCodeSuccess() {
                registView.OnShowSuccessGetCodeView();
                registView.dissLoadingView();
            }

            @Override
            public void getCodeFail() {
                registView.OnshowFailGetCodeView();
                registView.dissLoadingView();
            }
        });


    }

    /**
     * 注册
     * @param name
     * @param password
     * @param code
     */
    public void regist(String name, String password, String code) {
        registView.showLoadingView();
        loginAndRegistMananger.regist(name, password, code, new LoginAndRegistMananger.OnRegistLisener() {
            @Override
            public void registSuccess(String user) {
                registView.onShowSuccessRegistView(user);
                registView.dissLoadingView();
            }

            @Override
            public void registFailed() {
                registView.onShowFailedRegistView();
                registView.dissLoadingView();
            }
        });

    }

    /**
     * 登录
     * @param name
     * @param password
     */
    public void login(String name, String password) {
        loginView.showLoadingView();
        loginAndRegistMananger.login(name, password, new LoginAndRegistMananger.OnLoginListener() {
            @Override
            public void loginSuccess(User user) {
                loginView.onShowSuccessLoginView(user);
                loginView.dissLoadingView();

            }

            @Override
            public void loginFailed() {
                loginView.onShowFailedLoginView(0);
                loginView.dissLoadingView();
            }
        });
    }
}

最后就是使用了 在登陆界面
只需要实现loginview
然后调用 LoginAndRegistPresenter 实现登陆功能

/**
 * Created by wushange on 2016/06/01.
 */
public class LoginActivity extends BaseSwipeBackActivity implements LoginView {
    LoginAndRegistPresenter mloginPresenter = new LoginAndRegistPresenter(this);

    @ViewInject(R.id.login_btn)
    Button login;
    @ViewInject(R.id.go_reg_btn)
    Button go_reg_btn;
    @ViewInject(R.id.apptitle)
    AppTitle appTitle;

    @Override
    public int bindLayout() {
        return R.layout.activity_login_main_view;
    }

    @Override
    public void initView(View view) {
        appTitle.init(AppTitle.AppTitleStyle.BACK_TITLE);
        appTitle.setTitle("登陆");
        appTitle.setBackClickClisener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

    }

    @Override
    public void doBusiness(Context mContext) {

    }

    @Event(R.id.login_btn)
    private void setLogin(View v) {
        LogUtil.e("---setLogin----");
        mloginPresenter.login("111", "111");
    }

    @Event(R.id.go_reg_btn)
    private void setGo_reg_btn(View v) {
        AppUtils.startAct(getContext(), RegistActivity.class);
    }

    @Override
    public void onShowSuccessLoginView(User user) {
        LogUtil.e("---onShowSuccessLoginView----" + user.toString());
    }

    @Override
    public void onShowFailedLoginView(int error) {
        LogUtil.e("---onShowFailedLoginView----");
    }

    @Override
    public void showLoadingView() {
        LogUtil.e("---showLoginView----");
    }

    @Override
    public void dissLoadingView() {
        LogUtil.e("---dissLoginView----");
    }
}

注册界面同理

/**
 * Created by wushange on 2016/06/01.
 */
public class RegistActivity extends BaseSwipeBackActivity implements RegistView {
    LoginAndRegistPresenter mloginPresenter = new LoginAndRegistPresenter(this);

    @ViewInject(R.id.regist_btn)
    Button regist;

    @ViewInject(R.id.getcode_btn)
    Button getcode_btn;
    @ViewInject(R.id.apptitle)
    AppTitle appTitle;

    @Override
    public int bindLayout() {
        return R.layout.activity_regist_main_view;
    }

    @Override
    public void initView(View view) {
        appTitle.init(AppTitle.AppTitleStyle.BACK_TITLE);
        appTitle.setTitle("注册");
        appTitle.setBackClickClisener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

    }

    @Override
    public void doBusiness(Context mContext) {

    }

    @Event(R.id.regist_btn)
    private void setRegist(View v) {
        mloginPresenter.regist("111", "111", "1");
    }

    @Event(R.id.getcode_btn)
    private void setGetcode_btn(View v) {
        mloginPresenter.getCode("1564594066");
    }

    @Override
    public void onShowSuccessRegistView(String user) {
        LogUtil.e("--onShowSuccessRegistView---" + user);

    }

    @Override
    public void onShowFailedRegistView() {
        LogUtil.e("--onShowFailedRegistView---");
    }

    @Override
    public void OnShowSuccessGetCodeView() {
        LogUtil.e("--OnShowSuccessGetCodeView---");
    }

    @Override
    public void OnshowFailGetCodeView() {
        LogUtil.e("--OnshowFailGetCodeView---");
    }

    @Override
    public void showLoadingView() {
        LogUtil.e("--showLoadingView---");
    }

    @Override
    public void dissLoadingView() {
        LogUtil.e("--dissLoadingView---");
    }
}

以上是我自己本人今天看了下mvp的设计模式 我所领悟的。 做个笔记,还希望大家多多指教
欢迎大家加入我的qq交流群 74406192

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

MVP模式在Android开发中的最佳实践

这篇文章拖了好久了,一直存在草稿箱里没有继续写,趁几天有空,撸撸完。回想一下,你刚刚学习Android的时候,总会看到一些书上写着,Android使用的是MVC模式,Activity就是一个Contr...
  • sbsujjbcy
  • sbsujjbcy
  • 2016年02月21日 13:47
  • 5237

浅谈MVP模式及其在Android中的实践

前言   相信大家在软件开发中,都会用到各种设计模式, MVP的基本概念   传统中的Android应用开发中, MVP与MVC的区别   MVP是经典MVC的延伸和改进,从MVC的关系图...
  • mark_yangs
  • mark_yangs
  • 2017年07月13日 11:10
  • 255

Android开发MVP模式实践

现在用一个基于MVP模式的APP项目进一步分析MVP的实际ying
  • guxiao1201
  • guxiao1201
  • 2014年10月16日 17:14
  • 24427

安卓实践开发之MVP一步步实现到高级封装

在上家干了快2年辞职后在家休息了快一个月了,说实在的不上班的感觉爽(睡觉睡到自然醒,游戏玩到手抽筋)。哈哈,又是快到一年过中秋的时候了,好久没有更新博客了,今天顺便撸一篇。前言话说MVP的模式已经问世...
  • u013278099
  • u013278099
  • 2016年09月12日 16:51
  • 8693

Android开发架构模式MVP的简单思考

采用哪种软件设计模式都是为了达到如下目的,找到合适的加以运用就是最好的...
  • yianemail
  • yianemail
  • 2015年10月24日 13:11
  • 2425

Android中MVP模式讲解及实践

前两年的时候,我经常逛http://androidweekly.net这个网站,上面就有过很多文章介绍MVP模式,我很感兴趣,于是把这个东西介绍给身边的同事,同事们好像没有多大反应,可能是当时在国内M...
  • briblue
  • briblue
  • 2016年10月17日 15:44
  • 4858

Android MVP架构学习(附demo)

本篇关于MVP架构的学习是在查阅了很多资料整理出来。网上一些关于Android MVP的介绍都有点浅尝辄止,一个登录或者根据地区查询天气等的小Demo,没有实际在项目中应用的示例,所以在用MVP做完一...
  • qq_33748378
  • qq_33748378
  • 2016年08月12日 14:58
  • 2801

我实践中的mvp架构

我实践中的mvp架构在Android开发实践中,我也深刻理解到一个项目的架构稀烂会带来什么,成天的找bug,解决了一个bug,又出现了两个bug,这样的事肯定会经常出现。所以呢我决定使用传说中的mvp...
  • u012076212
  • u012076212
  • 2016年01月21日 10:09
  • 555

Android中单元测试 Robolectric + MVP模式

随着Agile的普及,以及开发人员对测试重要性的认识逐步加深,单元测试已经成了越来越多软件项目开发中不可缺少的一部分。无论项目是不是采用TDD的形式来进行开发,单元测试都能够为项目的修改和重构提供一定...
  • moubenmao
  • moubenmao
  • 2013年12月10日 11:59
  • 6227

Android之MVP模式实现登录和网络数据加载

MVP简介 相信大家对 MVC 都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,也是作为用户界面(用户层)的实现模式,那么类似...
  • DickyQie
  • DickyQie
  • 2017年02月06日 16:37
  • 1537
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android MVP 实践笔记
举报原因:
原因补充:

(最多只允许输入30个字)