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

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

相关文章推荐

android MVP实践

  • 2016年03月12日 23:06
  • 3.8MB
  • 下载

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

  • 2016年02月21日 13:44
  • 17.51MB
  • 下载

Android开发MVP模式实践

现在用一个基于MVP模式的APP项目进一步分析MVP的实际ying

Android mvp+retrofit+rxjava 编程实践(一)--BaseActivity

MVP+RxJava

Android MVP 实践 Dagger + activity/fragment + viewDelegate

前言:随着Android客户端的深入发展,Android客户端MVC开发模式中,View与Model层耦合严重, 导致拓展困难,多人协作的困难。如何让View与业务逻辑脱离开来。大神给出了MVP...

Android实践:MVC到MVP的演化

一、MVC 1.简介 MVC是目前大多数企业采用J2EE的结构设计,主要适用于交互式的Web应用。在Android中也有体现和使用,但是存在一定的弊端(下面将讲述),于是才有了Android官方推荐的...

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

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

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

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

Android MVP+Retrofit+RxJava实践小结

关于MVP、Retrofit、RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1、Android MVP 实例 2、Android Retrofit 2.0使用 3、RxJa...

Android MVP模式实践

前段时间做项目时有用到一个比较常用的设计模式-MVP模式,我个人比较喜欢有优美的结构的代码,我始终相信代码也是一种艺术,现在就特地将这一部分拿出来分享哈,自己也可以再熟悉熟悉。 OK,废话不多说先上...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android MVP 实践笔记
举报原因:
原因补充:

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