首先看下結構:Model、View(接口,Activity繼承)、Presenter(包含Module、View)
- 數據邏輯相當于M
- Activity(負責View的繪制以及與用戶交互)相當于V
- View與Model間的交互則為P
mvp視圖.png
Mvp代碼實現
代碼很簡單就用登錄的簡單邏輯
登錄頁面.png
代碼.png
從M開始:一個Model(UserModel.Class),包含數據,以及對數據的一些處理,如判空、拼接等等;
接下來是V:一個View接口(ILoginView.Class),一個實體類Activity(LoginActivity繼承接口ILoginView),所以Activity(負責View的繪制以及與用戶交互)相當于V;
最后就是P了:一個Presenter接口(ILoginPresenter.Class),一個實體類(LoginPersenter繼承接口ILoginPresenter,其實個人覺得可以不用寫Presenter接口,直接寫一個LoginPersenter實體類就行了),
Persenter其實是3個組成:1、一個View接口,2、一個Model實體,3、業務邏輯(只針對業務邏輯,如網絡請求,不做數據處理,如判空、拼接等。
從M開始
UserModel.Class
public class UserModel {
private String username;
private String password;
public UserModel(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int checkUserValidity(String username, String password) {
if (username == null || password == null ||
username.isEmpty() ||
password.isEmpty()) {
return -1;
}
return 0;
}
}
接下來是V
ILoginView.Class
public interface ILoginView {
void showProgress();
void hideProgress();
void setPasswordError();
String getUsername();
String getPassword();
void loginSuccess();
}
LoginActivity.Class
public class LoginActivity extends AppCompatActivity implements ILoginView,View.OnClickListener{
private EditText usernameEdit,passwrodEdit;
private Button loginButton;
ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvplogin);
pd = new ProgressDialog(this);
usernameEdit = (EditText) findViewById(R.id.et_username);
passwrodEdit = (EditText) findViewById(R.id.et_username);
loginButton = (Button) findViewById(R.id.bt_login);
loginButton.setOnClickListener(this);
}
@Override
public void showProgress() {
pd.show();
}
@Override
public void hideProgress() {
pd.cancel();
}
@Override
public void setPasswordError() {
passwrodEdit.setError("passwrod error");
}
@Override
public String getUsername() {
return usernameEdit.getText().toString();
}
@Override
public String getPassword() {
return passwrodEdit.getText().toString();
}
@Override
public void loginSuccess() {
Toast.makeText(this, "login success", Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_login:
break;
}
}
最后就是P了
ILoginPresenter.Class
public interface ILoginPresenter {
void Login(String username, String password);
}
LoginPresenter.Class
public class LoginPersenter implements ILoginPresenter{
private ILoginView loginView;
private UserModel mUser;
public LoginPersenter(ILoginView loginView) {
this.loginView = loginView;
initUser();
}
private void initUser(){
mUser = new UserModel(loginView.getUsername(),loginView.getPassword());
}
@Override
public void Login(String username, String password) {
loginView.showProgress();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
loginView.hideProgress();
int code = mUser.checkUserValidity(loginView.getUsername(), loginView.getPassword());
if (code == -1) {
loginView.setPasswordError();
} else if (code == 0) {
loginView.loginSuccess();
}
}
},2000);
}
}
最后在LoginActivity中補上P的調用
//初始化
loginPresenter = new LoginPersenter(this);
//Click方法中的調用
loginPresenter.Login(usernameEdit.getText().toString(),passwrodEdit.getText().toString());
到這里MVP模式的代碼就已經實現了。
數據流向:view->presenter->module->presenter->view
感謝:
Android開發架構選擇MVP or MVVM