MVP模式--登录

作者: Jackson杰 | 来源:发表于2017-11-14 14:37 被阅读0次
    前言

    上一篇文章,主要介绍了MVC、MVP、MVVM三种模式,这篇文章里主要用MVP模式实现一个登录模块,这个是我以前项目了用到的。
    先看下面的效果图。


    源码下载:https://github.com/baojie0327/SsrjMvp
    为了表述的更清楚一些,我就以MVP的三个部分,Model,View,Presenter三个部分介绍代码吧。

    View模块--界面
    • 首先要偶遇个IView的类,存放各个模块的IView的接口。当然,你也可以不把接口放在一个类里,可以单独写一个接口,但是那样,接口的数量会增多。
    public class IView {
        /**
         * 登录
         */
        public interface ILoginView {
            String getUserName();
            String getPassWord();
            void showToast(String content);
            void closeDispose(Disposable disposable);
            void showProgress();
            void hideProgress();
            void toOtherActivity();
        }
    }
    
    

    这个接口的方法数应根据界面上的逻辑处理,目前登录功能,界面上的处理主要是获取账号,密码两个EditText输入的数据,显示和隐藏ProgressBar,登录过程中的Toast提示,登录成功会后跳到别的界面,其中,closeDispose()方法是因为用到了RxJava2,需要在页面销毁时关闭Dispose

    • LoginActivity要实现这个接口,实现ILoginView里定义的方法。
    public class LoginActivity extends BaseActivity implements IView.ILoginView {
    
    }
    
    Model模块--数据
    • 同样,也有一个IModel的类,存放各个模块的IModel的接口,当然也可以每个模块单独写一个接口,不过那样接口的数据会增多。登录模块的数据操作定义在这个接口里,这里只是执行了一个登录操作。
    public class IModel {
    
    
        /**
         * 登录
         */
        public interface ILoginModel {
            void login(LoginBody loginBody, MyCallBack<UserLoginBean> callBack); //登录
        }
    
    }
    
    • 登录模块的LoginModel方法,继承自IModel里的对应接口,里面实现具体的数据逻辑,这里只有一个方法是登录,用的是Retrofit+Rxjava2,具体可以参照源码。
    public class LoginModel implements IModel.ILoginModel {
    
     
        @Override
        public void login(LoginBody loginBody, final MyCallBack<UserLoginBean> callBack) {
            JsNetworkService.getInstance().getIJsNetworkService()
                    .getLogin(loginBody)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<UserLoginBean>() {
                        @Override
                        public void onSubscribe(@NonNull Disposable d) {
                            Disposable mDisposable; //用于Activity销毁时停止执行
                            mDisposable = d;
                            callBack.onDispose(mDisposable);
                        }
    
                        @Override
                        public void onNext(@NonNull UserLoginBean userLoginBean) {
                            callBack.onSuccess(userLoginBean);
                        }
    
                        @Override
                        public void onError(@NonNull Throwable e) {
                            callBack.onError("Server Error", "服务器异常,请稍后再试");
                        }
    
                        @Override
                        public void onComplete() {
    
                        }
                    });
        }    
    }
    
    
    Presenter模块

    当然,这是VIew模块和Model模块的联系的桥梁了。

    public class LoginPresenter {
    
        private IView.ILoginView mILoginView;
        private LoginModel mLoginModel;
    
        public LoginPresenter(IView.ILoginView iLoginView) {
            this.mILoginView = iLoginView;
            mLoginModel = new LoginModel();
        }
    
        /**
         * 登录
         */
        public void login() {
          /*  Map<String, String> paraMap =new HashMap<>();
            paraMap.put("userName",mILoginView.getUserName());
            paraMap.put("passWord",mILoginView.getPassWord());*/
            mILoginView.showProgress();
    
            LoginBody loginBody = new LoginBody(mILoginView.getPassWord(), mILoginView.getUserName());
    
            mLoginModel.login(loginBody, new MyCallBack<UserLoginBean>() {
                @Override
                public void onSuccess(UserLoginBean userLoginBean) {
                    mILoginView.hideProgress();
                    if (userLoginBean.getStatus().equals("1")) {
                        mILoginView.toOtherActivity();
                    }
                    mILoginView.showToast(userLoginBean.getMessage());
    
    
                }
    
                @Override
                public void onError(String header, String message) {
                    mILoginView.hideProgress();
                    mILoginView.showToast(message);
                }
    
                @Override
                public void onDispose(Disposable disposable) {
                    mILoginView.closeDispose(disposable);
                }
            });
    
    
          /*  mLoginModel.login(loginBody, new MyCallBack.OnLoginListener() {
                @Override
                public void loginSuccess(UserLoginBean userLoginBean) {
                    mILoginView.showToast(userLoginBean.getMessage());
                }
    
                @Override
                public void loginFailed(String header, String message) {
    
                }
    
                @Override
                public void dispose(Disposable disposable) {
                    mILoginView.closeDispose(disposable);
                }
            });*/
    
        }
    
    
        private Map<String, String> createParaMap() {
            Map<String, String> paraMap = new HashMap<>();
            paraMap.put("userName", mILoginView.getUserName());
            paraMap.put("passWord", mILoginView.getPassWord());
            return paraMap;
        }
    
    }
    
    

    在Activity中,点击登录按键,会调用LoginPresenter的login()方法,这样View就通知到Presenter更新数据,在Presenter的login()方法里,会调用到Model层的login()方法,真正的去请求数据,请求完成后通过回调,反映到Presenter里面,Presenter在通知到View层数据变了,界面更新,这里的界面更新主要是ProgressBar的显示隐藏,Toaast显示提示信息,登录成功后跳到别的页面。

    /**
         * 登录
         */
        @OnClick(R.id.btn_login)
        public void login() {
            if (TextUtils.isEmpty(getUserName())) {
                mTlUsername.setErrorEnabled(true);
                mTlUsername.setError("账号不能为空");
            } else if (!validatePassword(getPassWord())) {
                mTlPassword.setErrorEnabled(true);
                mTlPassword.setError("密码字数过少");
            } else {
                mLoginPresenter.login();
            }
        }
    

    一个简单的登录模块的mvp模式就实现了,具体可以参照代码
    https://github.com/baojie0327/SsrjMvp

    相关文章

      网友评论

        本文标题:MVP模式--登录

        本文链接:https://www.haomeiwen.com/subject/wzzguxtx.html