美文网首页android性能优化安卓开发知识程序员
android 开发之初学MVP设计模式(模拟登录)

android 开发之初学MVP设计模式(模拟登录)

作者: zzj丶 | 来源:发表于2017-01-06 18:17 被阅读559次

    android 开发之初学MVP设计模式(模拟登录)

    以模拟登录为例,学习MVP模式

    一、新建工程,创建MVP目录结构

    Paste_Image.png
    1、activity  主要放activity界面
    2、Model  M层 主要放基本实体类、接口和接口实现类
    3、View   V层  view与presenter交互的接口,让Activity实现
    4、Presenter  P层  Model与view的控制器,持有view和model的引用,从view中获取参数,交给model去处理,执行结果通过接口的方式通过presenter层传递给view层进行显示。
    

    二、在veiw层中创建LoginView 接口,获取activity中需要的参数

    Paste_Image.png

    在Activity中实现该接口,将参数暴露给loginview

    Paste_Image.png

    三、在model层创建OnLoginListener接口 ,用来监听处理model实现后的操作;

    Paste_Image.png

    在presenter层创建LoginPresenter类实现OnLoginListener接口,用来处理model的View

    /**
     * Created by zzj on 2017/1/6.
     */
    public class LoginPresenter implements OnLoginListener {
        
        @Override
        public void onUsernameError() {
            
        }
    
        @Override
        public void onPasswordError() {
    
        }
    
        @Override
        public void onSuccess() {
    
        }
    
        @Override
        public void onFailure() {
    
        }
    }
    

    四、在model层创建登录接口(LoginPort),获取需要的参数

    /**
     * 登录接口
     * Created by zzj on 2017/1/6.
     */
    public interface LoginPort {
    
        void login(String username,String password,OnLoginListener onLoginListener);
    }
    
    

    在model层中创建loginModelImple类实现LoginPort接口,此类主要是处理网络请求的操作。由于本次未使用到网络请求,简单实现本地模拟登录。

    /** 处理网络请求的操作
     * Created by zzj on 2017/1/6.
     */
    public class LoginModelImple implements LoginPort {
        @Override
        public void login(String username, String password, OnLoginListener onLoginListener) {
    
            if(username.equals("admin")&&password.equals("123456")){
                onLoginListener.onSuccess();//登录成功
            }else if(!username.equals("admian")||!password.equals("123456")){
                onLoginListener.onUsernameError();//用户名或者密码错误
            }else {
                onLoginListener.onFailure();//登录失败
            }
    
        }
    }
    

    五、在LoginPresenter类中,声明实例化登录接口(LoginPort)和登录View(LoginView),将从view层获取的用户名和密码传送给model层,然后让activity中的登录按钮调用

    /**
     * Created by zzj on 2017/1/6.
     */
    public class LoginPresenter implements OnLoginListener {
        private LoginPort loginPort;//登录接口
        private LoginView loginView;//登录veiw
        //实例化登录接口和登录view
        public LoginPresenter(LoginView loginView){
            this.loginView = loginView;
            loginPort = new LoginModelImple();
        }
        /**
         * 将从view层中获取的用户名和密码传送给Model层
         * 然后让activity中的登录按钮调用此方法
         */
        public void login(){
            String username = loginView.getUsername();
            String password = loginView.getPassword();
            loginPort.login(username,password,this);
        }
        @Override
        public void onUsernameError() {
            loginView.showToast("用户名或者密码错误");
        }
        @Override
        public void onSuccess() {
            loginView.showToast("登录成功!");
        }
        @Override
        public void onFailure() {
            loginView.showToast("异常错误!");
        }
    }
    

    在loginAcitivy中实例化LoginPresenter类,调用login方法。

    public class LoginActivity extends AppCompatActivity implements View.OnClickListener,LoginView {
        private AppCompatEditText username ,password;
        private AppCompatButton loginBt;
        private LoginPresenter loginPresenter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
            loginPresenter = new LoginPresenter(this);
        }
        private void initView(){
            username = (AppCompatEditText) findViewById(R.id.login_username);
            password = (AppCompatEditText) findViewById(R.id.login_password);
            loginBt = (AppCompatButton) findViewById(R.id.login_loginbt);
            loginBt.setOnClickListener(this);
        }
        /**
         * 向view层暴露参数
         * @return 用户名
         */
        public String getUsername(){
            return username.getText().toString().trim();
        }
        public String getPassword(){
            return password.getText().toString().trim();
        }
        @Override
        public void showToast(String msg) {
            Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onClick(View v) {
            loginPresenter.login();
        }
    }
    

    效果展示:


    Screenshot_1483695444.png Screenshot_1483695452.png

    demo地址:https://github.com/z1060932884/MVPLoginDemo

    相关文章

      网友评论

      本文标题:android 开发之初学MVP设计模式(模拟登录)

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