【Android实例】MVP简单实用

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

发布了107 篇原创文章 · 获赞 142 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/u013293125/article/details/94599009
今日推荐