IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 安卓MVP -> 正文阅读

[移动开发]安卓MVP

一、概述

MVC结构

M(model):业务逻辑和实体模型
V(view):布局文件
C(controller):Activity
说明:三层耦合在一起,会非常臃肿,难以扩展维护。

MVP结构

M(model):业务逻辑和实体模型
V(view):布局文件+Activity/Fragment+View组件+简单用户交互(不包含业务逻辑)
P(presenter):负责view和model的交互。
说明:presenter会将view和model分隔开,自己作为交互的桥梁,实现解耦。

二者中的model说明:业务逻辑和实体模型。
业务逻辑包含:网络请求、数据存储、数据流转、数据验证等等。
实体模型:bean对象。

交互

1、MVC是M和V可以直接交互。
2、MVP是M和V不能直接交互,它们是通过P进行交互的。
在这里插入图片描述

二、代码示例

使用最常见的登录案例,代码实现过程描述:Presenter主要用于分离view和model,它和两层都有交互,所以持有view和model的引用。当然view和model都需要和Presenter交互,他们分别持有Presenter的引用。
当用户点击登录时,view层要通过Presenter层的validatedLogin方法,实际调用model层的login方法验证登录;model层通过Presenter层的OnLoginFinishedListener的方法,将各种登录结果返回给view层展示出来。

1)Presenter

1.1 Presenter层 添加 view–>model的桥梁方法

public interface LoginPresenter {

    void validatedLogin(UserBean loginUser); //验证登陆信息

    void clear(); //释放资源
}

1.2 Presenter层 添加 model–>view的桥梁方法

public interface OnLoginFinishedListener {
    void onLoginFailedByAccountError();

    void onLoginFailedByPasswordError();

    void onLoginFailedByOtherError();

    void onLoginSuccess();
}

1.3 Presenter层 实现 view和model的真实交互。

public class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener {
    private LoginModel loginModel = new LoginModelImpl(); // 持有Model层的引用
    private LoginView loginView;

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

    @Override
    public void validatedLogin(UserBean loginUser) {
        if (loginView != null) {
            loginView.showProgress();
        }
        loginModel.login(loginUser, this); // 调用Model层真实的登录验证方法,并传值过去。
    }

    @Override
    public void clear() {
        loginView = null;
    }

    @Override
    public void onLoginFailedByAccountError() {
        if (loginView != null) {
            loginView.hideProgress();
            loginView.onAccountError();
        }
    }

    @Override
    public void onLoginFailedByPasswordError() {
        if (loginView != null) {
            loginView.hideProgress();
            loginView.onPasswordError();
        }
    }

    @Override
    public void onLoginFailedByOtherError() {
        if (loginView != null) {
            loginView.hideProgress();
            loginView.onOtherError();
        }
    }

    @Override
    public void onLoginSuccess() {
        if (loginView != null) {
            loginView.hideProgress();
        }
    }
}

2)Model

2.1 Model层 创建 实体模型

public class UserBean {
    private String phoneNumber;
    private String passWord;

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}

2.2 Model层 添加 登录验证的方法

public interface LoginModel {
    void login(UserBean loginUser, OnLoginFinishedListener listener);
}

2.3 Model层 实现 登录验证的方法

public class LoginModelImpl implements LoginModel {

    @Override
    public void login(UserBean loginUser, OnLoginFinishedListener listener) {
        final String phoneNumber = loginUser.getPhoneNumber();
        final String password = loginUser.getPassWord();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                boolean error = false;
                if (TextUtils.isEmpty(phoneNumber)) {
                    listener.onLoginFailedByAccountError(); //回复登录验证结果
                    error = true;
                }
                if (TextUtils.isEmpty(password)) {
                    listener.onLoginFailedByPasswordError(); //回复登录验证结果
                    error = true;
                }
                if (!error) {
                    listener.onLoginSuccess(); 回复登录验证结果
                }
            }
        }, 2000);
    }
}

3)View

3.1 View层 添加 展示登录结果的方法

public interface LoginView {
    void showProgress();

    void hideProgress();

    void onAccountError();

    void onPasswordError();

    void onOtherError();

    void loginSuccess();
}

3.2 View层 实现 展示登录结果的方法

public class LoginActivity extends AppCompatActivity implements LoginView {
    private LoginPresenter loginPresenter; //持有Presenter层的引用

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        loginPresenter = new LoginPresenterImpl(this);
        initView();
    }

    private void initView() {
        EditText editText_account = findViewById(R.id.editText_account);
        EditText editText_password = findViewById(R.id.editText_password);
        findViewById(R.id.button_login).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                UserBean userBean = new UserBean();
                userBean.setPhoneNumber(editText_account.getText().toString());
                userBean.setPassWord(editText_password.getText().toString());
                loginPresenter.validatedLogin(userBean); //调用Presenter层桥梁方法,并传真实数据过去。
            }
        });
    }

    @Override
    public void showProgress() {
        ToastUtil.show2Style(this,"显示进度条");
    }

    @Override
    public void hideProgress() {
        ToastUtil.show2Style(this,"隐藏进度条");
    }

    @Override
    public void onAccountError() {
        ToastUtil.show2Style(this,"账号错误");
    }

    @Override
    public void onPasswordError() {
        ToastUtil.show2Style(this,"密码错误");
    }

    @Override
    public void onOtherError() {
        ToastUtil.show2Style(this,"其他原因错误");
    }

    @Override
    public void loginSuccess() {
        ToastUtil.show2Style(this,"登陆成功!");
    }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:34:46  更:2022-07-17 16:37:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 2:56:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码