天天看點

mvp初探

mvp是model,view,presenter這三者,其中model是實體邏輯處理層,view是視圖層,而presenter是持有層。前兩者大家比較熟悉了,presenter是持有層,在presenter層中持有model,view層來實作功能。簡單來說presenter就是拿model的方法,view的參數完成兩者之間的互動。還有一點就是Presenter與View之間的互動是通過接口的

mvp圖:

mvp初探

以登陸注冊功能為例子

mvp初探

model

明顯要個user的實體類,這裡使用了bmob的背景,BmobUser已經為我們實作了一些基本的set,get方法。

public class UserBean  extends BmobUser {

}
           

model處理的邏輯業務

接口類,為了後面的參數傳遞,在方法裡面放了一個參數接口

public interface ILoginRegister {

public void login(String user_name, String password,  Context context,IOnloginListener onloginListener);
}
           

實作類,login方法裡處理登入的邏輯

public class LoginRegister implements ILoginRegister {


//登陸邏輯
@Override
public void login(String user_name, final String password, final Context context, final IOnloginListener onloginListener) {




}
           

view層

接口類,view就是與使用者的層。要想有什麼方法。

擷取手機号碼,擷取密碼,登入成功,登陸失敗,找回密碼,注冊

public interface ILoginView {
String getUserName();
String getPassword();

void showLoading();
void hideLoading();

void loginSuccess();
void loginFailed(String msg);

void register();
void findPassword();


}
           

實作類,view層的實作類就是activity類

package com.example.administrator.demo;
public class LoginActivity extends AppCompatActivity implements ILoginView {
private EditText mEtUserName,mEtPassword;
private Button mBtLogin,mBtRegister,mBtFindPassword;
private ProgressBar mPbLoading;



private LoginPresenter loginPresenter=new LoginPresenter(this);//執行個體化持有對象

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initView();



}
void initView(){
    getSupportActionBar().setTitle("登入");
    mEtUserName=(EditText)findViewById(R.id.et_user_name);
    mEtPassword=(EditText)findViewById(R.id.et_password);
    mBtLogin=(Button)findViewById(R.id.bt_login);
    mBtRegister=(Button)findViewById(R.id.bt_register);
    mBtFindPassword=(Button)findViewById(R.id.bt_findPassword);
    mPbLoading=(ProgressBar)findViewById(R.id.pb_login);

    mBtLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            loginPresenter.login(LoginActivity.this);//持有層
        }
    });
    mBtRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            register();

        }
    });

    mBtFindPassword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            findPassword();

        }
    });

}
@Override
public String getUserName() {
    return mEtUserName.getText().toString();
}

@Override
public String getPassword() {
    return mEtPassword.getText().toString();
}

@Override
public void showLoading() {
    mPbLoading.setVisibility(View.VISIBLE);

}

@Override
public void hideLoading() {
    mPbLoading.setVisibility(View.GONE);

}

@Override
public void loginSuccess() {
    Intent intent=new Intent(this,WelcomActivity.class);
    startActivity(intent);
    finish();

}

@Override
public void loginFailed(String msg) {
    Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}

@Override
public void register() {
    startActivity(new Intent(this,RegisterActivity.class));

}

@Override
public void findPassword() {
    startActivity(new Intent(this,FindPasswordActivity.class));

}
}
           

持有層,持有層就是持有model,view層的對象來交換

public class LoginPresenter {

private ILoginRegister loginRegister;
private ILoginView loginRegisterView;

public LoginPresenter(ILoginView loginRegisterView){
    this.loginRegisterView=loginRegisterView;
    this.loginRegister=new LoginRegister();
}
public void login(Context context){
    loginRegisterView.showLoading();
    loginRegister.login(loginRegisterView.getUserName(), loginRegisterView.getPassword(),context, new IOnloginListener() {
        @Override
        public void loginSuccess(UserBean userBean) {
            loginRegisterView.hideLoading();
            loginRegisterView.loginSuccess();


        }

        @Override
        public void loginFailed(String msg) {
            loginRegisterView.hideLoading();
            loginRegisterView.loginFailed(msg);

        }
    });
}
           

感想:

1.剛開始很不适應這種模式,出現了大量的接口。

2.感覺model層加重了很多,覺得在實際中要分情況來,就是全部功能不一定要安裝mvp這種模式,應該可以混合。

3.最後感謝鴻洋的部落格http://blog.csdn.net/lmj623565791/article/details/46596109