首页 > 其他分享 >Android MVP模型的学习与使用

Android MVP模型的学习与使用

时间:2024-07-24 15:29:12浏览次数:11  
标签:MVP username 模型 public Presenter Android password Model View

一 、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;
    }
}

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()) {
            loginView.setUsernameError();
            return;
        }
        if (password.isEmpty()) {
            loginView.setPasswordError();
            return;
        }

        if (user.isValid()) {
            loginView.navigateToHome();
        } else {
            loginView.setPasswordError();
        }
    }
}

interface:

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

activity:

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" />
    <Button
        android:id="@+id/register_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/register" />

</LinearLayout>

三、总结

  1. View调用Presenter

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

  1. Presenter调用Model

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

  1. Model处理数据并回调Presenter

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

  1. Presenter处理结果并更新View

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

  1. View更新UI

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

标签:MVP,username,模型,public,Presenter,Android,password,Model,View
From: https://www.cnblogs.com/20lxj666/p/18320993

相关文章

  • 玩转大模型之三(FastGPT+OneAPI本地部署)
    一、服务器服务器:一台Linux16核32GIP:10.33.19.16基础环境:Docker、Docker-Compose二、FastGPT安装首先下载docker-compose.yml和config.json两个文件mkdirfastgptcdfastgptcurl-Ohttps://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/......
  • 大模型应用开发——问答系统回答准确性评估的三类方法
    在开发了基于文档的问答系统之后,需要评估系统对问题回答的准确性,将系统的回答与正确答案进行比对并给出评分。我们实践了以下三类方法,最终对比发现,在评估系统回答的准确性时,用大模型来评估最有效。本文旨在给出大模型的prompt供参考,可以根据自己的需求调整。另两类方法仅作简......
  • Android Studio查看SQLite数据库(快速方便)
    在AndroidStudio不要使用databasenavigator/DBNavigator/DBBrowser插件查看SQLite数据库,因为AndroidStudio自带的Appinspection工具可以快捷的查看当前项目的SQLite数据库。使用教程找到Appinspection位置1,就在左下角的工具栏位置2,右键左边偏上的工具栏的moret......
  • 是否可以限制 scikit learn 模型仅预测某些标签?
    我有两个模型在多个标签上进行了训练,并用它来预测游戏的类型。我注意到,由于模型经过训练,有时相同的输入数据可能会让两个模型输出截然不同的流派。我想将预测限制为另一个模型建议的内容,但不知道该怎么做。下面的示例Model1_labels=["JRPG","Horror","FPS","Platforme......
  • 如何优雅地将复杂的Python对象和SQLAlchemy对象模型类结合起来?
    我有一个相当复杂的类,具有从提供的df到init计算的复杂属性,这些属性可能是最终可以序列化为字符串的其他类类型。在Python中,我想处理对象而不是原始类型,但也想使用SQLAlchemy与数据库交互。表中的列与许多类属性相同,如何优雅地组合这两个类?我可以使用组合并将数据......
  • 白嫖百度大模型算力
    白嫖百度大模型算力目前百度大模型使用有免费版本,不用白不用。官网链接https://console.bce.baidu.com/qianfan/modelcenter/model/buildIn/list 进入模型广场选择一个免费模型试用点击体验&开通付费  提交订单(免费)     接口调用(python)先进入安全认......
  • 在 Flask-SQLAlchemy 模型类中使用数据类装饰器?
    我编写了一个Flask-SQLAlchemy模型类,如下所示(来自此参考):fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)db=SQLAlchemy(app)classUser(db.Model):__tablename__='user'user_id=db.Column(d......
  • 中国大模型落地进展如何?
    在ChatGPT爆发之后,国内外科技赛道都被掀起了巨大波澜,随后在国内这段时间里,大量的大模型争先恐后地出现。那么截止到现在,大模型在国内土壤落地得怎么样了?一起来看看本文的解读。如下距离ChatGPT爆发的那一天,已经过去8个月了。8个月的时间,中国诸多大模型拔地而起,以飞快的......
  • 开源大模型正在重塑企业AI应用,16个案例看看它们如何落地
    企业运作新引擎:开源大模型。各种性能优异的大模型横空出世,开源大型语言模型在企业界的应用也逐渐引起广泛关注。不过,这也使新的问题浮出水面,企业应该怎样有效地部署和应用这些模型来发挥它们最大的价值呢?图灵奖得主YannLeCun在X上向大家分享了一篇VentureBeat的......
  • 蛙跳扩散模型轨迹预测
    扩散模型轨迹预测文章目录扩散模型轨迹预测1.问题定义2.方法论2.1前向扩散2.2逆过程2.3蛙跳扩散模型的步骤2.4蛙跳初始化器2.5去噪模块3.实践3.1训练3.2推理阶段3.3源码3.4问题记录参考论文《LeapfrogDiffusionModelforStochasticTrajectoryPr......