文章目录
- 前言
- MVP模式是MVC模式在Android上的一种变体,要介绍MVP就得先介绍MVC。在MVC模式中,Activity应该是属于View这一层。而实质上,它既承担了View,同时也包含一些Controller的东西在里面。这对于开发与维护来说不太友好,耦合度大高了。把Activity的View和Controller抽离出来就变成了View和Presenter,这就是MVP模式。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e7469fcca61a47a1807ad3257849e1c5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGJqMjN2czY=,size_20,color_FFFFFF,t_70,g_se,x_16) 让我们来用mvp写一个登录界面 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b320b67edb2e4c4bb2b1db8f9e4fd94b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGJqMjN2czY=,size_13,color_FFFFFF,t_70,g_se,x_16)
- 一、Model层
-
- 二、Present 层
-
- 三、View 层
-
- 总结
前言
MVP模式是MVC模式在Android上的一种变体,要介绍MVP就得先介绍MVC。在MVC模式中,Activity应该是属于View这一层。而实质上,它既承担了View,同时也包含一些Controller的东西在里面。这对于开发与维护来说不太友好,耦合度大高了。把Activity的View和Controller抽离出来就变成了View和Presenter,这就是MVP模式。 让我们来用mvp写一个登录界面
一、Model层
1.定义Model接口
public interface ILoginModel {
void login(String account, String pwd, LoginListener listener);
}
2.实现ILoginModel ,用子线程睡眠3秒来模拟网络的请求过程
public class LoginModelImpl implements ILoginModel {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override
public void login(String account, String pwd, LoginListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (TextUtils.equals(account, "lbj") && TextUtils.equals(pwd, "123")) {
handler.post(new Runnable() {
@Override
public void run() {
listener.onSuccess();
}
});
} else {
handler.post(new Runnable() {
@Override
public void run() {
listener.onFailed();
}
});
}
}
}).start();
}
}
3.补充:Listener的定义
public interface LoginListener {
void onSuccess();
void onFailed();
}
二、Present 层
1.Presenter接口
代码如下(示例):
public interface ILoginPresenter {
void doLogin(String account,String pwd);
}
2.实现Presenter接口
public class LoginPresenterImpl implements ILoginPresenter {
private ILoginModel model;
private ILoginView view;
public LoginPresenterImpl(ILoginView loginView) {
model = new LoginModelImpl();
view = loginView;
}
@Override
public void doLogin(String account, String pwd) {
view.showPb();
model.login(account, pwd, new LoginListener() {
@Override
public void onSuccess() {
view.hidePb();
view.toast("登录成功!!!");
}
@Override
public void onFailed() {
view.hidePb();
view.toast("登录失败!!!");
}
});
}
}
三、View 层
1、IView接口,抽象view的行为
public interface ILoginView {
void showPb();
void hidePb();
void toast(String content);
}
2、Activity 去实现IView接口
public class MainActivity extends AppCompatActivity implements ILoginView {
private EditText etAccount;
private Button btnLogin;
private ProgressBar pbLogin;
private EditText etPwd;
private LoginPresenterImpl presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new LoginPresenterImpl(this);
pbLogin = findViewById(R.id.pb_login);
btnLogin = findViewById(R.id.btn_login);
etAccount = findViewById(R.id.et_account);
etPwd = findViewById(R.id.et_pwd);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
presenter.doLogin(etAccount.getText().toString(), etPwd.getText().toString());
}
});
}
@Override
public void showPb() {
pbLogin.setVisibility(View.VISIBLE);
}
@Override
public void hidePb() {
pbLogin.setVisibility(View.INVISIBLE);
}
@Override
public void toast(String content) {
Toast.makeText(this, content, Toast.LENGTH_SHORT).show();
}
}
补充:xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".view.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="账号"
android:textSize="34sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/et_account"
android:layout_width="200dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:text="密码"
android:textSize="34sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<EditText
android:id="@+id/et_pwd"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="39dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView2"
app:layout_constraintTop_toBottomOf="@+id/et_account" />
<Button
android:id="@+id/btn_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="59dp"
android:text="登录"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_pwd" />
<ProgressBar
android:id="@+id/pb_login"
android:layout_width="200dp"
android:layout_height="200dp"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/btn_login"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_pwd" />
</androidx.constraintlayout.widget.ConstraintLayout>
总结
枯燥的看mvp架构难以理解,建议新手敲一下这个登录界面,使用mvp架构,这样可以大致建立一个对mvp架构的初步理解,后续就可以在项目中使用也可以与他人交流。
|