初识mvp

来源:互联网 发布:淘宝交易快照怎么看 编辑:程序博客网 时间:2024/05/17 07:23

刚刚开始看mvp,以下是自己浅显的见识,尽做笔记使用。
MVP 把 Activity 中的 UI 逻辑抽象成 View 接口,把业务逻辑抽象成 Presenter 接口,Model 类还是原来的 Model。Activity 只用来响应生命周期,工作都在prestenter中完成。现以一个登陆模块的例子讲述mvp.
这里写图片描述

public class LoginActivity extends AppCompatActivity implements View.OnClickListener, ILoginView {    private EditText editUser;    private EditText editPass;    private Button   btnLogin;    private Button   btnClear;    ILoginPresenter loginPresenter;    private ProgressBar progressBar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_login);        editUser = (EditText) this.findViewById(R.id.et_login_username);        editPass = (EditText) this.findViewById(R.id.et_login_password);        btnLogin = (Button) this.findViewById(R.id.btn_login_login);        btnClear = (Button) this.findViewById(R.id.btn_login_clear);        progressBar = (ProgressBar) this.findViewById(R.id.progress_login);        btnLogin.setOnClickListener(this);        btnClear.setOnClickListener(this);        loginPresenter = new LoginPresenterCompl(this);        loginPresenter.setProgressBarVisibility(View.INVISIBLE);    }    @Override    public void onClick(View view) {        switch(view.getId()){            case R.id.btn_login_clear:                loginPresenter.clear();                break;            case R.id.btn_login_login:                loginPresenter.setProgressBarVisibility(View.VISIBLE);                btnLogin.setEnabled(false);                btnClear.setEnabled(false);                loginPresenter.doLogin(editUser.getText().toString(),editPass.getText().toString());                break;            default:break;        }    }    @Override    public void onClearText() {        editUser.setText("");        editPass.setText("");    }    @Override    public void onLoginResult(Boolean result, int code) {        loginPresenter.setProgressBarVisibility(View.INVISIBLE);        btnLogin.setEnabled(true);        btnClear.setEnabled(true);        if (result){            Toast.makeText(this,"Login Success",Toast.LENGTH_SHORT).show();        }else{            Toast.makeText(this,"Login Fail, code = " + code,Toast.LENGTH_SHORT).show();        }    }    @Override    public void onSetProgressBarVisibility(int visibility) {        progressBar.setVisibility(visibility);    }}

这是登陆主界面,view只做了视图的操作,初始化参数,视图显示/隐藏操作。所以得业务处理交给了presenter,view层只和presenter交互。
loginPresenter = new LoginPresenterCompl(this);初始化preenter层。

public interface ILoginView {    void onClearText();    void onLoginResult(Boolean result,int code);    void onSetProgressBarVisibility(int visibility);}
public class LoginPresenterCompl implements ILoginPresenter{    ILoginView iLoginView;    IUser      user;    Handler    handler;    public LoginPresenterCompl(ILoginView iLoginView){        this.iLoginView=iLoginView;        initUser();        handler =new Handler(Looper.getMainLooper());    }    private void initUser() {        user = new UserModel("mvp","mvp");    }    @Override    public void clear() {        iLoginView.onClearText();    }    @Override    public void doLogin(String name, String passwd) {        Boolean isLoginSuccess = true;        final int code =user.checkUserValidity(name,passwd);        if(code != 0){            isLoginSuccess = false;        }        final Boolean result = isLoginSuccess;        handler.postDelayed(new Runnable() {            @Override            public void run() {                iLoginView.onLoginResult(result, code);            }        },3000);    }    @Override    public void setProgressBarVisibility(int visibility) {        iLoginView.onSetProgressBarVisibility(visibility);    }}

prestenter和view层交互 this.iLoginView=iLoginView;
presnterer和model层交互 user = new UserModel(“mvp”,”mvp”);
但model和view是不直接进行交互的!
prestener层业务逻辑处理完之后调用view层回调,在view层进行页面展现。
唯一有点不爽的事要写那么多借口。。。

public interface ILoginPresenter {    void clear();    void doLogin(String name,String passwd);    void setProgressBarVisibility(int visibility);}
public interface IUser {    String getName();    String getPasswd();    int checkUserValidity(String name, String passwd);}
public class UserModel implements IUser{    String name;    String passwd;    public UserModel(String name, String passwd) {        this.name = name;        this.passwd = passwd;    }    @Override    public String getName() {        return name;    }    @Override    public String getPasswd() {        return passwd;    }    @Override    public int checkUserValidity(String name, String passwd){        if (name==null||passwd==null||!name.equals(getName())||!passwd.equals(getPasswd())){            return -1;        }        return 0;    }}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:gravity="center_vertical"    tools:context=".MainActivity">    <EditText android:id="@+id/et_login_username" android:layout_width="match_parent"        android:layout_height="wrap_content" android:hint="USERNAME"/>    <EditText android:id="@+id/et_login_password" android:layout_width="match_parent"        android:layout_height="wrap_content" android:hint="PASSWORD"/>    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"        android:orientation="horizontal">        <Button android:id="@+id/btn_login_login" android:layout_width="match_parent"            android:layout_height="wrap_content" android:text="Login" android:layout_weight="1" android:layout_marginRight="4dp"/>        <Button android:id="@+id/btn_login_clear" android:layout_width="match_parent"            android:layout_height="wrap_content" android:text="Clear" android:layout_weight="1" android:layout_marginLeft="4dp"/>    </LinearLayout>    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="correct user: mvp, mvp" android:layout_marginTop="3dp"/>    <ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content"        android:layout_marginTop="40dp" android:id="@+id/progress_login"/></LinearLayout>

简单说一下mvp的调用,比如显示progress显示
loginPresenter.setProgressBarVisibility(View.VISIBLE);使progress显示,先给presenter处理

LoginPresenterCompl类 @Override    public void setProgressBarVisibility(int visibility) {        iLoginView.onSetProgressBarVisibility(visibility);    }

presente处理完之后给view层回调

LoginActivity类 @Override    public void onSetProgressBarVisibility(int visibility) {        progressBar.setVisibility(visibility);    }

view层显示出来。
再比如登录处理:

//LoginActivity类 loginPresenter.doLogin(editUser.getText().toString(),editPass.getText().toString());

view层给presenter层处理登录逻辑。

//LoginPresenterCompl类 @Override    public void doLogin(String name, String passwd) {        Boolean isLoginSuccess = true;        final int code =user.checkUserValidity(name,passwd);        if(code != 0){            isLoginSuccess = false;        }        final Boolean result = isLoginSuccess;        handler.postDelayed(new Runnable() {            @Override            public void run() {                iLoginView.onLoginResult(result, code);            }        },3000);    }

presenter层调用model层的检查输入方法checkUserValidity

//UserModel类@Override    public int checkUserValidity(String name, String passwd){        if (name==null||passwd==null||!name.equals(getName())||!passwd.equals(getPasswd())){            return -1;        }        return 0;    }

model层回调返回检测结果给presenter层,presenter层对结果进行处理,又返回view层
iLoginView.onLoginResult(result, code);

//LoginActivity类@Override    public void onLoginResult(Boolean result, int code) {        loginPresenter.setProgressBarVisibility(View.INVISIBLE);        btnLogin.setEnabled(true);        btnClear.setEnabled(true);        if (result){            Toast.makeText(this,"Login Success",Toast.LENGTH_SHORT).show();        }else{            Toast.makeText(this,"Login Fail, code = " + code,Toast.LENGTH_SHORT).show();        }    }

view层页面展现。

原创粉丝点击