安卓MVP的简单使用

来源:互联网 发布:c语言三种循环结构 编辑:程序博客网 时间:2024/06/05 10:15

<code>这里写图片描述</code>

MVP模式的核心思想:

MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。

这就是MVP模式,现在这样的话,Activity的工作的简单了,只用来响应生命周期,其他工作都丢到Presenter中去完成。从上图可以看出,Presenter是Model和View之间的桥梁,为了让结构变得更加简单,View并不能直接对Model进行操作,这也是MVP与MVC最大的不同之处。
MVP模式的作用

MVP的好处都有啥,谁说对了就给他 KIRA!!(<ゝω·)☆

1.分离了视图逻辑和业务逻辑,降低了耦合2.Activity只处理生命周期的任务,代码变得更加简洁3.视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性4.Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试5.把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存泄露和OOM

做一个简单的登录功能
这里写图片描述

简单的分个包
这里写图片描述

LoginActivity

public class LoginActivity extends ActionBarActivity implements ILoginView, View.OnClickListener {    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_main);        //find view        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);        //set listener        btnLogin.setOnClickListener(this);        btnClear.setOnClickListener(this);        //init        loginPresenter = new LoginPresenterCompl(this);        loginPresenter.setProgressBarVisiblity(View.INVISIBLE);    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.btn_login_clear:                loginPresenter.clear();                break;            case R.id.btn_login_login:                loginPresenter.setProgressBarVisiblity(View.VISIBLE);                btnLogin.setEnabled(false);                btnClear.setEnabled(false);                loginPresenter.doLogin(editUser.getText().toString(), editPass.getText().toString());                break;        }    }    @Override    public void onClearText() {        editUser.setText("");        editPass.setText("");    }    @Override    public void onLoginResult(Boolean result, int code) {        loginPresenter.setProgressBarVisiblity(View.INVISIBLE);        btnLogin.setEnabled(true);        btnClear.setEnabled(true);        if (result){            Toast.makeText(this,"Login Success",Toast.LENGTH_SHORT).show();            startActivity(new Intent(this, HomeActivity.class));        }        else            Toast.makeText(this,"Login Fail, code = " + code,Toast.LENGTH_SHORT).show();    }    @Override    public void onSetProgressBarVisibility(int visibility) {        progressBar.setVisibility(visibility);    }}

ILoginPresenter

public interface ILoginPresenter {    void clear();    void doLogin(String name, String passwd);    void setProgressBarVisiblity(int visiblity);}

LoginPresenterCompl

public class LoginPresenterCompl implements ILoginPresenter {    ILoginView iLoginView;    IUser user;    Handler    handler;    public LoginPresenterCompl(ILoginView iLoginView) {        this.iLoginView = iLoginView;        initUser();        handler = new Handler(Looper.getMainLooper());    }    @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 setProgressBarVisiblity(int visiblity){        iLoginView.onSetProgressBarVisibility(visiblity);    }    private void initUser(){        user = new UserModel("mvp","mvp");    }}

ILoginView

public interface ILoginView {    public void onClearText();    public void onLoginResult(Boolean result, int code);    public void onSetProgressBarVisibility(int visibility);}
原创粉丝点击