MVP作为Android最常用的框架,网上已经有很多相关的解释,每个人对MVP的实现方式都有些许不同,但总的思想还是一样的,这方面的理论知识网上已经有很多人写过了,我这里就不拾人牙慧了,我自己基于自己对MVP的理解,写了一个关于登录的简单demo
![](https://img.haomeiwen.com/i14417681/178f1e8cbda34df0.png)
布局
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto">
<EditText
android:id="@+id/edit_account"
android:layout_width="250dp"
android:layout_height="50dp"
android:maxLines="1"
android:hint="account"
android:layout_marginTop="30dp"
android:layout_centerHorizontal="true"/>
<EditText
android:id="@+id/edit_password"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_below="@id/edit_account"
android:maxLines="1"
android:hint="password"
android:inputType="textPassword"
android:layout_centerHorizontal="true" />
<Button
android:id="@+id/btn_login"
android:layout_below="@id/edit_password"
android:layout_width="200dp"
android:text="login"
android:textAllCaps="false"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:layout_height="40dp" />
<ProgressBar
android:id="@+id/progressBar"
android:visibility="gone"
style="?android:attr/progressBarStyle"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Model层
BaseModel
public interface BaseModel {
void onCompleted(); //结束
void onFailure(); //失败
void onSuccess(); //成功
}
ILoginModel
public interface ILoginModel extends BaseModel {
//这里可以写登录自己特有接口,我偷懒就不写了
void onSuccess();
void onFailure();
}
LoginModel
public class LoginModel {
public static void judge(final String account, final String password,
final ILoginModel callback) {
//模拟一下网络延迟
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//这里随便写了一个判断,正常是要去做网络请求的
if(account.equals("admin")&&password.equals("123456")){
callback.onSuccess();
}else {
callback.onFailure();
}
callback.onCompleted();
}
},1000);
}
}
Presenter层
MVP的一个缺点我觉得就是Presenter层可能会非常庞大
BasePresenter
public abstract class BasePresenter<T extends BaseView> {
protected T mView;
public void attachView(T view) {
mView = view;
}
public void detachView() {
mView = null;
}
protected boolean isViewAttached() {
return mView != null;
}
public T getView() {
return mView;
}
}
LoginPresenter
public class LoginPresenter extends BasePresenter<ILoginView> {
public void Judge(String account, String password) {
if (!isViewAttached()){
return;
}
mView = getView();
mView.showWaiting();
LoginModel.judge(account, password, new ILoginModel() {
@Override
public void onSuccess() {
if (isViewAttached()) {
mView.successMessage();
}
}
@Override
public void onFailure() {
if (isViewAttached()) {
mView.failureMessage();
}
}
@Override
public void onCompleted() {
if (isViewAttached()){
mView.dismissWaiting();
}
}
});
}
}
View层
BaseView
public interface BaseView {
void showWaiting(); //开启等待框
void dismissWaiting(); //关闭等待框
}
ILoginView
public interface ILoginView extends BaseView {
void successMessage(); //登录成功
void failureMessage(); //登录失败
}
BaseActivity
public abstract class BaseActivity extends AppCompatActivity {
//相关业务代码
}
MVPActivity
public abstract class MVPActivity<V extends BaseView, T extends BasePresenter<V>>
extends BaseActivity implements BaseView{
protected T mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter=createPresenter();
mPresenter.attachView((V)this);
}
@Override
protected void onDestroy() {
super.onDestroy();
mPresenter.detachView();
}
protected abstract T createPresenter();
}
LoginActivity
public final class LoginActivity extends MVPActivity<ILoginView, LoginPresenter>
implements ILoginView, View.OnClickListener {
private EditText accountEdit;
private EditText passwordEdit;
private Button loginBtn;
private ProgressBar progressBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
accountEdit = findViewById(R.id.edit_account);
passwordEdit = findViewById(R.id.edit_password);
loginBtn = findViewById(R.id.btn_login);
progressBar = findViewById(R.id.progressBar);
loginBtn.setOnClickListener(this);
}
void login(String account, String password){
mPresenter.Judge(account, password);
}
@Override
protected LoginPresenter createPresenter() {
return new LoginPresenter();
}
@Override
public void showWaiting() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void dismissWaiting() {
progressBar.setVisibility(View.GONE);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_login:
login(accountEdit.getText().toString(),passwordEdit.getText().toString());
break;
default:
break;
}
}
@Override
public void successMessage() {
Toast.makeText(this,"success",Toast.LENGTH_SHORT).show();
}
@Override
public void failureMessage() {
Toast.makeText(this,"failure",Toast.LENGTH_SHORT).show();
}
}
网友评论