美文网首页
Andorid开发中对MVP的理解

Andorid开发中对MVP的理解

作者: 乐皮儿 | 来源:发表于2018-06-01 13:53 被阅读0次

    最近android项目的框架设计大多数使用了MVP框架,这样可以减轻Activity,Fragment的代码量,使代码结构比较清晰,但是不同的程序员对MVP的理解不同,因此有多种写法,下面谈谈我对MVP的理解。

    Model 层主要负责数据获取和处理,可以将一些复杂的业务逻辑处理代码放到这里来写,比如网络请求获取数据,从本地数据库读取数据等。View层主要是界面交互,结果展示等,一般是Activity和Fragment负责这一层,Presenter 我理解更像是一个中间层,作为View层和Model层的桥梁,其内部分别持有View 和 Model 的对象,用来处理逻辑。下面通过一个例子来具体说明一下。

    代码实例就是一个简单的用户输入用户名和密码,之后通过验证跳转到下一页的功能,页面如下。


    Screenshot_2018-06-01-11-30-02.jpg

    为了设计规范,都使用接口加实现的方式,首先介绍一下View层,定义一个接口ILoginView

    void showProgress();//显示loading框
    void hideProgress();//隐藏loading框
    void setUsernameError();//处理用户名错误
    void setPasswordError();//处理密码错误
    

    几个接口函数都是负责交互显示的。LoginActivity实现接口中的函数

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        /*新建Presenter负责处理逻辑*/
        presenter = new BaseLoginPresenter(this,new LoginModelImpl());
    } 
    @Override
    public void showProgress() {
        progressBar.setVisibility(View.VISIBLE);
    }
    @Override 
    public void hideProgress() {
        progressBar.setVisibility(View.GONE);
    }
    @Override
    public void setUsernameError() {
        username.setError(getString(R.string.username_error));
    }
    @Override
    public void setPasswordError() {
        password.setError(getString(R.string.password_error));
    }
    @Override
    public void navigateToHome() {
        startActivity(new Intent(this, ScrollLayoutActivity.class));
        finish();
    }
    @Override
    public void onClick(View v) {
        presenter.validateCredentials(username.getText().toString(),       
        password.getText().toString());
    }
    

    Model 层也是先定义一个接口,将业务规范写进去,这里比较简单,只有一个Login函数,还有一个登陆成功的回调接口定义

    /*登陆成功回调借口*/
    interface OnLoginFinishedListener {
        void onUsernameError();
    
        void onPasswordError();
    
        void onSuccess();
    }
    void login(String username, String password, ILoginModel.OnLoginFinishedListener listener);
    

    实现代码如下:这里使用一个两秒延时模拟登陆请求

    @Override
    public void login(final String username, final String password, final     
        ILoginINteractor.OnLoginFinishedListener listener) {
        new Handler().postDelayed(new Runnable() {
            @Override public void run() {
                if (TextUtils.isEmpty(username)) {
                    listener.onUsernameError();
                    return;
                }
                if (TextUtils.isEmpty(password)) {
                    listener.onPasswordError();
                    return;
                }
                listener.onSuccess();
            }
        }, 2000);
    }
    

    接下来就是核心类Presenter的实现,这里不需要设计接口,因为大部分业务逻辑都写在Model层,此类要实现Model层的回调函数即可

    private ILoginView loginView; //持有ILoginView,View层对象
    private ILoginModel loginModel  ;//持有ILoginModel ,Model层对象
    
    public BaseLoginPresenter(ILoginView loginView, ILoginModel loginModel  ) {
        super(loginView);
        this.loginView = loginView;
        this.loginModel = loginModel  ;
    }
    
    @Override
    public void onUsernameError() {
        if (isViewAttached()) {
            loginView.setUsernameError();
            loginView.hideProgress();
        }
    }
    
    @Override
    public void onPasswordError() {
        if (isViewAttached()) {
            loginView.setPasswordError();
            loginView.hideProgress();
        }
    
    }
    
    @Override
    public void onSuccess() {
        if (isViewAttached()) {
            loginView.navigateToHome();
        }
    }
    
    /*登陆验证的实现*/
    @Override
    public void validateCredentials(String username, String password) {
    
        if (isViewAttached()) {
            loginView.showProgress();
        }
        /*调用Model层的login函数*/
        loginModel.login(username, password, this);
    }
    

    到此,一个最简单的MVP实现的例子介绍完了,在今后的开发中,业务逻辑更加复杂时,可以考虑一个View层对应对个Model和多个Presenter,这样会使代码更加清晰,但是MVP框架会大大的增加代码量,所以程序员们可以根据自己的需要选择合适的框架进行开发。
    谢谢!

    相关文章

      网友评论

          本文标题:Andorid开发中对MVP的理解

          本文链接:https://www.haomeiwen.com/subject/wqghsftx.html