Andorid开发中对MVP的理解

2018-06-01  本文已影响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框架会大大的增加代码量,所以程序员们可以根据自己的需要选择合适的框架进行开发。
谢谢!

上一篇下一篇

猜你喜欢

热点阅读