Android中MVP模式的实例

  MVP模式是我们在项目架构上经常用到的一种模式,基于MVC模式演变而来,即model-view-presenter,model层负责提供数据,view负责展示UI,presenter负责逻辑处理。在MVP模式中,model和view层通过中间层presenter来交互的,model和view不需要直接交互,同时,presenter和view又是通过接口来交互,实际上view的变更 就不会影响到presenter。

    举个比较简单的例子,用户输入用户名和密码,显示登录进度条:

      思路是:我们会在View层获取到用户名和密码,然后将用户名和密码传给presenter,presenter经过一定的处理之后传给model层,model根据用户名和密码去做一些处理,获得进度条,然后presenter将从model层获得的进度条数据传给view层进行显示。model层和view层并不直接交互,而是通过presenter个中间层来进行通信。


  一、首先我们定义一个bean类;

 

public class LoginBean {
    public  String name;
    public  String  password;

    public LoginBean(String name,String password){
        this.name=name;
        this.password=password;
    }

}

二、然后我们定义一个提供进度条数据的model:

  


public class LoginModel {
    
    public  LoginBean mLoginBean;
    public  LoginProgressListener mListener;

    public int progress=0;
    private Handler mHandler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
                 // 这里是模拟网络请求获取的进度条数据
mListener.progresslistener( progress++) ;
mHandler.sendEmptyMessageDelayed( 0 , 100) ;
if
( progress== 100){
mHandler.removeMessages( 0) ;
}
break;
}
}
} ;
public LoginModel(LoginBean loginBean ,LoginProgressListener mListener){
  this. mListener=mListener ;
this
. mLoginBean=loginBean ;
}
public void login(){
if(!TextUtils. isEmpty( mLoginBean.getName())&&!TextUtils. isEmpty( mLoginBean.getPassword())){
mHandler.sendEmptyMessage( 0) ;
}
}
}


  三、我们定义一个Presenter来处理数据逻辑

 

public interface LoginPresenter {
  //view层调用的方法
    interface  View{
        void  showProgress(int progress);
        void initView();
    }
 /**这里定义了一个基类BasePresenter,用于传入view,(考虑到项目中用到Presenter的几率很大,定义一个BasePresenter)*/
 abstract class  Presenter extends  BasePresenter<View>{
        public Presenter(View view) {
            super(view);
        }
        //presenter所做的逻辑处理方法
        abstract  void login(String name,String password);
    }

}
public class BasePresenter<T> {

     public T view;
     public BasePresenter(T view){
        this.view=view;
    }

}
四、实现Presenter

public class LoginPresenterImpl extends LoginPresenter.Presenter {

    private LoginModel loginModel;
    private LoginProgressListener mListener; //通过listener来获取到model的数据


    public LoginPresenterImpl(LoginPresenter.View view) {
        super(view);
    }

    @Override
    void login(String name, String password) {
        LoginBean loginBean=new LoginBean(name,password);
        mListener=new LoginProgressListener() {
          @Override
          public void progresslistener(int progress) {
           //调用view层的方法,在UI上展示进度
  view.showProgress(progress) ;
}
} ;
loginModel= new LoginModel(loginBean , mListener) ;
loginModel.login() ; //调用model层的方法
}
}

    以上可见Presenter和view以及model的交互方式。

  五、最后就是activity的呈现:

public class LoginActivity extends AppCompatActivity implements LoginPresenter.View {

    private EditText etUserName;
    private EditText etUserPwd;
    private Button btnLogin;
    private ProgressBar bar;

    private  LoginPresenterImpl presenter;  //声明Presenter的实现类

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        presenter=new LoginPresenterImpl(this);
        initView();
    }

    @Override
    public void showProgress(final int progress) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                bar.setProgress(progress);
            }
        });
    }

    @Override
    public void initView() {
        etUserName= (EditText) findViewById(R.id.et_username);
        etUserPwd= (EditText) findViewById(R.id.et_pwd);
        btnLogin= (Button) findViewById(R.id.btn_login);
        bar= (ProgressBar) findViewById(R.id.bar);

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               presenter.login(etUserName.getText().toString(),etUserPwd.getText().toString());
            }
        });
    }
}

    用MVP模式实现的一个非常简单的例子,其实这个登录操作完全可以在一个activity中实现,但是这样就会导致activity的工作过于臃肿,在真正的项目中将过多工作放在一个类中会导致这个类难以维护,而通过MVP模式进行解耦,层次分明,分工明确,后期维护和需求变更都会更加方便,而且presenter是纯粹的Java代码,这样我们就可以脱离Android进行单元测试,


猜你喜欢

转载自blog.csdn.net/qq_26984087/article/details/76974406
今日推荐