Android中MVP的应用

作者: 猪爸爸Hulk | 来源:发表于2017-10-28 14:26 被阅读152次

    初识MVP

    MVC:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。 从MVC和MVP两者结合来看,Controlller/Presenter在MVC/MVP中都起着逻辑控制处理的角色,起着控制各业务流程的作用。而 MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控 View与Model之间的间接交互,MVP的结构图如下所示,对于这个图理解即可而不必限于其中的条条框框,毕竟在不同的场景下多少会有些出入的。在 Android中很重要的一点就是对UI的操作基本上需要异步进行也就是在MainThread中才能操作UI,所以对View与Model的切断分离是 合理的。此外Presenter与View、Model的交互使用接口定义交互操作可以进一步达到松耦合也可以通过接口更加方便地进行单元测试。

    View 对应于Activity,负责View的绘制以及与用户交互
    Model 依然是业务逻辑和实体模型
    Presenter 负责完成View于Model间的交互

    MVP项目结构

    MVP项目结构图

    M-Model-模型、V-View-视图、P-Presenter-表示器

    首先,实体类User
    public class User {
        private String name;
        private String pwd;
    
        public User(String name, String pwd) {
            this.name = name;
            this.pwd = pwd;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    }
    
    IUserModel
    public interface IUserModel {
        void login(String name, String pwd, OnLoginListener listener);
    }
    
    OnLoginListener
    public interface OnLoginListener {
        void onSuccess(User user);
    
        void onFailed();
    }
    
    UserModel
    public class UserModel implements IUserModel {
        @Override
        public void login(String name, String pwd, OnLoginListener listener) {
            if (TextUtils.isEmpty(name) || TextUtils.isEmpty(pwd)) {
                return;
            }
            if ("wanghao".equals(name) && "123".equals(pwd)) {
                listener.onSuccess(new User(name, pwd));
            }else {
                listener.onFailed();
            }
        }
    }
    
    UserLoginView
    public interface UserLoginView {
        String getUserName();
    
        String getPwd();
    
        void onSuccess(User user);
    
        void onFailed();
    
        void showLoading();
    
        void hideLoading();
    }
    
    UserPresenter
    public class UserPresenter {
    
        private UserLoginView loginView;
        private UserModel userModel;
        private Handler handler=new Handler();
    
        public UserPresenter(UserLoginView loginView) {
            this.loginView = loginView;
            userModel = new UserModel();
        }
    
        public void login() {
            loginView.showLoading();
            userModel.login(loginView.getUserName(), loginView.getPwd(), new OnLoginListener() {
                @Override
                public void onSuccess(final User user) {
                    //一般为为网络请求,需要开启子线程,不能直接更新UI
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            loginView.onSuccess(user);
                            loginView.hideLoading();
                        }
                    });
                }
    
                @Override
                public void onFailed() {
                    loginView.onFailed();
                    loginView.hideLoading();
                }
            });
        }
    }
    
    MainActivity
    public class MainActivity extends AppCompatActivity implements UserLoginView {
    
        private EditText et_user;
        private EditText et_pwd;
        private Button bt_login;
        private UserPresenter userPresenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            userPresenter = new UserPresenter(this);
            initView();
        }
    
        private void initView() {
            et_user = (EditText) findViewById(R.id.et_user);
            et_pwd = (EditText) findViewById(R.id.et_pwd);
            bt_login = (Button) findViewById(R.id.bt_login);
            bt_login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    userPresenter.login();
                }
            });
        }
    
        @Override
        public String getUserName() {
            return et_user.getText().toString();
        }
    
        @Override
        public String getPwd() {
            return et_pwd.getText().toString();
        }
    
        @Override
        public void onSuccess(User user) {
            Toast.makeText(this, "欢迎" + user.getName(), Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onFailed() {
            Toast.makeText(this, "失败", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void showLoading() {
    
        }
    
        @Override
        public void hideLoading() {
    
        }
    }
    

    最后

    个人理解,有什么不对的地方还请各位大神指正。

    相关链接

    Android中MVC的应用
    Android中MVP的应用

    相关文章

      网友评论

        本文标题:Android中MVP的应用

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