【Android实例】MVP简单实用

作者: 秀叶寒冬 | 来源:发表于2019-07-04 11:24 被阅读6次

    1 MVP简介

    Presenter传递数据给Model,Model得到数据来请求网络,再返回数据给Presenter,Presenter再把得到的Model数据传递给View显示。MVP整体的一个流程就是这样。相比MVC来说,Model和View互相不干涉,达到完全解耦。MVP原理图如下所示:


    MVP

    2 源码示例

    • 定义一个ILogin接口
    public interface ILogin {
        interface ILoginView{
            void setUserName(String userName);
            void setPassword(String password);
            String getUserName();
            String getPassword();
        }
    
        interface ILoginPresenter{
            void login();
        }
    
        interface ILoginModel{
            void login(String userName,String password,ICallBack<String> callBack);
        }
    
    }
    
    • 定义一个结果返回接口ICallBack
    package com.example.mvpdemo;
    
    public interface ICallBack<T> {
        void result(T resultInfo);
    }
    
    • 然后分别实现Model、Presenter及View逻辑,首先写一个LoginModel类,该类继承ILoginModel,主要是进行网络请求、数据库操作等数据方面的操作
    package com.example.mvpdemo;
    
    public class LoginModel implements ILogin.ILoginModel {
        @Override
        public void login(String userName, String password, ICallBack<String> callBack) {
            //这里进行网络请求返回数据等
            callBack.result("登录成功");
        }
    }
    
    
    • 然后写一个LoginPresenter类,该类继承ILoginPresenter,主要作用是处理业务逻辑方面的操作,然后将最终数据返回给View显示,实现Model与View的解耦
    package com.example.mvpdemo;
    
    import android.content.Context;
    import android.widget.Toast;
    
    public class LoginPresenter implements ILogin.ILoginPresenter {
        private ILogin.ILoginView mLoginView;
        private ILogin.ILoginModel mLoginModel;
        private Context mContext;
        public LoginPresenter(ILogin.ILoginView loginView, Context context){
            mLoginView = loginView;
            mLoginModel = new LoginModel();
            mContext = context;
        }
    
        private String getUserName(){
            return mLoginView.getUserName();
        }
        private String getPassword(){
            return mLoginView.getPassword();
        }
    
        @Override
        public void login() {
            String userName = getUserName();
            String password = getPassword();
            //判断输入是否为空
            if (!inputValid()){
                return;
            }
    
            mLoginModel.login(userName,password,new ICallBack<String>(){
    
                @Override
                public void result(String resultInfo) {
                    if (resultInfo.equals("登录成功")){
                        Toast.makeText(mContext,"登录成功!",Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
        private boolean inputValid(){
            if(getPassword().isEmpty()){
                Toast.makeText(mContext,"密码不能为空",Toast.LENGTH_SHORT).show();
                return false;
            }
            if (getUserName().isEmpty()){
                Toast.makeText(mContext,"用户名不能为空",Toast.LENGTH_SHORT).show();
                return false;
            }
            return true;
        }
    
    
    }
    
    
    • 最后写View,这里的View指的是Activity或者Fragment。让MainActivity实现ILoginView接口,然后调用LoginPresenter方法,将输入数据传入到Presenter层进行业务逻辑操作。
    package com.example.mvpdemo;
    
    import android.app.Activity;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class MainActivity extends Activity implements ILogin.ILoginView {
        private EditText userName;
        private EditText password;
        private Button button;
        private ILogin.ILoginPresenter mLoginPresenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initData();
            initView();
            initEvent();
        }
    
        private void initEvent() {
            button.setOnClickListener(listener);
        }
        private View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()){
                    case R.id.button:
                        mLoginPresenter.login();
                        break;
                }
            }
        };
        private void initData() {
            mLoginPresenter = new LoginPresenter(this,this);
        }
    
        private void initView() {
            userName = findViewById(R.id.user_name);
            password = findViewById(R.id.password);
            button = findViewById(R.id.button);
        }
    
        @Override
        public void setUserName(String userName) {
            this.userName.setText(userName);
        }
    
        @Override
        public void setPassword(String password) {
            this.password.setText(password);
        }
    
        @Override
        public String getUserName() {
            return userName.getText()==null?"":userName.getText().toString();
        }
    
        @Override
        public String getPassword() {
            return password.getText()==null?"":password.getText().toString();
        }
    }
    
    

    3 源码地址

    https://download.csdn.net/download/u013293125/11274664

    相关文章

      网友评论

        本文标题:【Android实例】MVP简单实用

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