初识mvp

刚刚开始看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层页面展现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值