Android MVP模型

Android mvp

一 、MVP(Model-View-Presenter)概叙

MVP(Model-View-Presenter)是一种用于Android应用程序开发的架构模式,旨在将应用程序的不同部分分离,以提高代码的可维护性和可测试性。MVP模型包含三个主要组成部分:Model、View和Presenter。

  1. Model (模型):

    ​ Model负责处理应用程序的数据和业务逻辑。它从数据源获取数据,并执行数据处理和保存操作。Model通常不包含任何与用户界面(UI)相关的代码,它专注于数据的获取和操作。

  2. View (视图):

    ​ View负责显示数据并呈现用户界面。它接收用户的输入并将这些输入传递给Presenter进行处理。View不直接处理数据逻辑或业务逻辑,它只是通过Presenter与Model交互。

  3. Presenter (主持人):

    ​ Presenter作为Model和View之间的中介,处理从View传递过来的用户输入,并调用Model来获取或更新数据。然后,它将处理后的数据传递回View进行显示。Presenter不直接处理UI的具体实现,它关注的是业务逻辑和数据的处理。

二、MVP的简单使用

model:

public class User {
    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    //判断用户名与密码
    public boolean isValid() {
        return username.equals("admin") && password.equals("password");
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}

interface:

public interface LoginView {
    void setUsernameError();
    void setPasswordError();
    void navigateToHome();
}

Presenter:

public class LoginPresenter {
    //接口
    private LoginView loginView;

    public LoginPresenter(LoginView loginView) {
        this.loginView = loginView;
    }

    public void validateCredentials(String username, String password) {

        User user = new User(username, password);
        if (username.isEmpty()) {
            //告诉activity用户名为空
            loginView.setUsernameError();
            return;
        }
        if (password.isEmpty()) {
            //告诉activity密码为空
            loginView.setPasswordError();
            return;
        }

        //使用model方法判断密码相等
        if (user.isValid()) {
            //告诉activty登陆成功
            loginView.navigateToHome();
        } else {
            //告诉activty密码错误
            loginView.setPasswordError();
        }
    }
}

activity:

//实现LoginView接口
public class MainActivity extends AppCompatActivity implements LoginView {

    private EditText username;
    private EditText password;
    private Button loginButton;
    private LoginPresenter loginPresenter;

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

        username = findViewById(R.id.username);
        password = findViewById(R.id.password);
        loginButton = findViewById(R.id.login_button);
        //初始化主持人
        loginPresenter = new LoginPresenter(this);

        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //主持人判断方法
                loginPresenter.validateCredentials(username.getText().toString(), password.getText().toString());
            }
        });
    }


    @Override
    public void setUsernameError() {
        username.setError(getString(R.string.username_error));
    }

    @Override
    public void setPasswordError() {
        password.setError(getString(R.string.password_error));
    }
    @Override
    public void navigateToHome() {
        Toast.makeText(this, "Login Successful", Toast.LENGTH_SHORT).show();
    }
}

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/username_hint" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password_hint"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/login_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/login" />

</LinearLayout>

三、总结

View调用Presenter

View层捕获用户的操作,并通过调用Presenter的方法来请求数据或触发业务逻辑

Presenter调用Model

Presenter接收到来自View的请求后,执行相应的业务逻辑。通常,Presenter会调用Model层来请求数据或执行操作。

Model处理数据并回调Presenter

Model层处理请求的数据操作,如从数据库或网络获取数据。操作完成后,Model会通过回调或接口将数据或操作结果通知Presenter。这种回调机制通常通过Model定义的接口来实现。

Presenter处理结果并更新View

Presenter接收到Model的回调后,处理数据并根据结果决定如何更新View`。

View更新UI

View根据从Presenter接收到的数据或指令,更新用户界面。这包括显示数据、更新文本框、导航到新界面等。

代码地址

https://gitee.com/lxj_dear/android-mvp

posted @ 2024-07-24 22:28  疾风不问归途  阅读(107)  评论(0)    收藏  举报