美文网首页
Android 中MVP模式入门

Android 中MVP模式入门

作者: 涛涛123759 | 来源:发表于2018-01-15 15:53 被阅读50次

    1、MVP和MVC

    MVC简介

    在Android我们经常会用MVC模式,其中。

    M对应Model,代表业务数据
    V对应View,代表视图
    C对应Controller,代表控制器。


    用户通过界面组件进行操作,也就是View层,相应的动作会传递给控制器也就是Controller层,而Controller根据自己的业务逻辑去操作数据层也就是Model,而最终数据层的变化会同步更新到视图层。

    MVP简介

    M(Model) 数据相关层
    V(View) 视图层,如Activity上的布局
    P(Presenter) 纽带层,用来连接Model与View.

    而在架构中运用MVP以后,Presenter的出现,将Actvity视为View层,Presenter负责完成View层与Model层的交互。现在是这样的:

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

    MVP 与 MVC 区别

    其实最明显的区别就是,MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的(代码中会体现)。

    二、代码

    目录结构:


    运行结果:

    (一)Model:

    public class User {
        private String name;
        private String sex;
    
        public User(String name, String sex) {
            this.name = name;
            this.sex = sex;
        }
    
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    }
    

    public interface IUserBiz {
    
        void getData(String name, String sex, OnSteDataListener listener);
    
    }
    

    UserBiz类主要云用来加载和保存数据,并把数据通过presenter传到view中

    public class UserBiz implements IUserBiz{
        @Override
        public void getData(final String name, final String sex, final OnSteDataListener listener) {
            new Thread(new Runnable() {
                @Override
                public void run() {
    
                    try {
                        Thread.sleep(2000); //延时2s
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    if ("1".equals(name) && "2".equals(sex)) {
                        User user = new User(name, sex); //初始化数据
                        listener.setSuccess(user); //把正确的数据传到presenter中
                   } else {
                        listener.setFailed();//把错误的数据传到presenter中
                    }
                }
            }).start();
        }
    
    }
    

    public interface OnSteDataListener {
        void setSuccess(User user);
        void setFailed();
    }
    

    (二) View

    在Activity中需要用到的interface

    public interface IUserLoadView {
    
        void initView();
    
        String getName();
    
        String getSex();
    
        void setTextView(User user);
    
        void setPresenter();
    }
    

    setPresenter 方法主要用来初始化Presenter;


    public class MainActivity extends AppCompatActivity implements IUserLoadView {
        private EditText editName, editSex;
        private TextView textView;
        private Button btnGet, btnSet;
        private UserPresenter userPresenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
            setPresenter();
        }
    
        @Override
        public void initView() {
            editName = (EditText) findViewById(R.id.edit_name);
            editSex = (EditText) findViewById(R.id.edit_sex);
            textView = (TextView) findViewById(R.id.text_view);
            btnGet = (Button) findViewById(R.id.btn_get);
            btnSet = (Button) findViewById(R.id.btn_set);
    
            btnGet.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    userPresenter.getDatas();
                }
            });
        }
    
        @Override
        public String getName() {
            return editName.getText().toString();
        }
    
    
        @Override
        public String getSex() {
            return editSex.getText().toString();
        }
    
        @Override
        public void setTextView(final User user) {
            textView.post(new Runnable() {//在主线程中加载UI
                @Override
                public void run() {
                    if (null != user) {
                        textView.setText("姓名 : " + user.getName() +
                              "/n性别 : " + user.getSex());
                    } else {
                        textView.setText("获取数据失败!");
                    }
                }
            });
    
        }
    
    
        @Override
        public void setPresenter() {
            userPresenter = new UserPresenter(this);
        }
    }
    

    用MainActivity中setTextView()接受Presenter传过来的数据时,一定要在主线程中把数据展示到界面中。

    (三)Presenter

    Presenter是用作Model和View之间交互的桥梁

    public interface IPresenterInterface {
    
        void getDatas();
    
    }
    

    public class UserPresenter implements IPresenterInterface{
        private IUserLoadView iUserLoadView;
        private UserBiz userBiz;
    
        public UserPresenter(IUserLoadView iUserLoadView) {
            this.iUserLoadView = iUserLoadView;
            userBiz = new UserBiz();
        }  
    
        @Override
        public void getDatas() {
            userBiz.getData(iUserLoadView.getName(), iUserLoadView.getSex(), new OnSteDataListener() {
                @Override
                public void setSuccess(User user) {
                    iUserLoadView.setTextView(user); //正确数据展示到View中
                }
    
                @Override
                public void setFailed() { 
                    iUserLoadView.setTextView(null); //错误数据展示到View中
                }
            });
        }
    }
    

    源码

    相关文章

      网友评论

          本文标题:Android 中MVP模式入门

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