刚刚开始看mvp,以下是自己浅显的见识,尽做笔记使用。
MVP 把 Activity 中的 UI 逻辑抽象成 View 接口,把业务逻辑抽象成 Presenter 接口,Model 类还是原来的 Model。Activity 只用来响应生命周期,工作都在prestenter中完成。现以一个登陆模块的例子讲述mvp.
public class LoginActivity extends AppCompatActivity implements View.OnClickListener, ILoginView {
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_login);
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);
btnLogin.setOnClickListener(this);
btnClear.setOnClickListener(this);
loginPresenter = new LoginPresenterCompl(this);
loginPresenter.setProgressBarVisibility(View.INVISIBLE);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.btn_login_clear:
loginPresenter.clear();
break;
case R.id.btn_login_login:
loginPresenter.setProgressBarVisibility(View.VISIBLE);
btnLogin.setEnabled(false);
btnClear.setEnabled(false);
loginPresenter.doLogin(editUser.getText().toString(),editPass.getText().toString());
break;
default:break;
}
}
@Override
public void onClearText() {
editUser.setText("");
editPass.setText("");
}
@Override
public void onLoginResult(Boolean result, int code) {
loginPresenter.setProgressBarVisibility(View.INVISIBLE);
btnLogin.setEnabled(true);
btnClear.setEnabled(true);
if (result){
Toast.makeText(this,"Login Success",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"Login Fail, code = " + code,Toast.LENGTH_SHORT).show();
}
}
@Override
public void onSetProgressBarVisibility(int visibility) {
progressBar.setVisibility(visibility);
}
}
这是登陆主界面,view只做了视图的操作,初始化参数,视图显示/隐藏操作。所以得业务处理交给了presenter,view层只和presenter交互。
loginPresenter = new LoginPresenterCompl(this);初始化preenter层。
public interface ILoginView {
void onClearText();
void onLoginResult(Boolean result,int code);
void onSetProgressBarVisibility(int visibility);
}
public class LoginPresenterCompl implements ILoginPresenter{
ILoginView iLoginView;
IUser user;
Handler handler;
public LoginPresenterCompl(ILoginView iLoginView){
this.iLoginView=iLoginView;
initUser();
handler =new Handler(Looper.getMainLooper());
}
private void initUser() {
user = new UserModel("mvp","mvp");
}
@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 setProgressBarVisibility(int visibility) {
iLoginView.onSetProgressBarVisibility(visibility);
}
}
prestenter和view层交互 this.iLoginView=iLoginView;
presnterer和model层交互 user = new UserModel(“mvp”,”mvp”);
但model和view是不直接进行交互的!
prestener层业务逻辑处理完之后调用view层回调,在view层进行页面展现。
唯一有点不爽的事要写那么多借口。。。
public interface ILoginPresenter {
void clear();
void doLogin(String name,String passwd);
void setProgressBarVisibility(int visibility);
}
public interface IUser {
String getName();
String getPasswd();
int checkUserValidity(String name, String passwd);
}
public class UserModel implements IUser{
String name;
String passwd;
public UserModel(String name, String passwd) {
this.name = name;
this.passwd = passwd;
}
@Override
public String getName() {
return name;
}
@Override
public String getPasswd() {
return passwd;
}
@Override
public int checkUserValidity(String name, String passwd){
if (name==null||passwd==null||!name.equals(getName())||!passwd.equals(getPasswd())){
return -1;
}
return 0;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_vertical"
tools:context=".MainActivity">
<EditText android:id="@+id/et_login_username" android:layout_width="match_parent"
android:layout_height="wrap_content" android:hint="USERNAME"/>
<EditText android:id="@+id/et_login_password" android:layout_width="match_parent"
android:layout_height="wrap_content" android:hint="PASSWORD"/>
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"
android:orientation="horizontal">
<Button android:id="@+id/btn_login_login" android:layout_width="match_parent"
android:layout_height="wrap_content" android:text="Login" android:layout_weight="1" android:layout_marginRight="4dp"/>
<Button android:id="@+id/btn_login_clear" android:layout_width="match_parent"
android:layout_height="wrap_content" android:text="Clear" android:layout_weight="1" android:layout_marginLeft="4dp"/>
</LinearLayout>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="correct user: mvp, mvp" android:layout_marginTop="3dp"/>
<ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_marginTop="40dp" android:id="@+id/progress_login"/>
</LinearLayout>
简单说一下mvp的调用,比如显示progress显示
loginPresenter.setProgressBarVisibility(View.VISIBLE);使progress显示,先给presenter处理
LoginPresenterCompl类
@Override
public void setProgressBarVisibility(int visibility) {
iLoginView.onSetProgressBarVisibility(visibility);
}
presente处理完之后给view层回调
LoginActivity类
@Override
public void onSetProgressBarVisibility(int visibility) {
progressBar.setVisibility(visibility);
}
view层显示出来。
再比如登录处理:
//LoginActivity类
loginPresenter.doLogin(editUser.getText().toString(),editPass.getText().toString());
view层给presenter层处理登录逻辑。
//LoginPresenterCompl类
@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);
}
presenter层调用model层的检查输入方法checkUserValidity
//UserModel类
@Override
public int checkUserValidity(String name, String passwd){
if (name==null||passwd==null||!name.equals(getName())||!passwd.equals(getPasswd())){
return -1;
}
return 0;
}
model层回调返回检测结果给presenter层,presenter层对结果进行处理,又返回view层
iLoginView.onLoginResult(result, code);
//LoginActivity类
@Override
public void onLoginResult(Boolean result, int code) {
loginPresenter.setProgressBarVisibility(View.INVISIBLE);
btnLogin.setEnabled(true);
btnClear.setEnabled(true);
if (result){
Toast.makeText(this,"Login Success",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"Login Fail, code = " + code,Toast.LENGTH_SHORT).show();
}
}
view层页面展现。