Android MVP 写法

 前言

Model:负责数据逻辑

View:负责视图逻辑

Presenter:负责业务逻辑

持有关系:

1、View 持有 Presenter

2、Model 持有 Presenter

3、Presenter 持有 View

4、Presenter 持有 Model

辅助工具:ViewBinding

执行流程:View  ==> Presenter ==> Model ==> Presenter ==> View

案例效果图:

1、定义IPresenter接口

/*** 代理接口 负责业务逻辑*/
public interface IPresenter extends IBasePresenter {void setView(IView view);  // 持有 Viewvoid setModel(IModel model);  // 持有 Modelvoid onDataChanged(String data); // 时时修改Model的数据,由View通知 Presentervoid onDataChangedUpdateText(String data); // 修改View的TextView数据,由Model通知 Presentervoid submitFromData(); // 执行Model的 提交表单服务,由View通知 Presentervoid showSubmitFromLoading(String data); // 执行View的显示loading方法,由Model通知 Presentervoid hideSubmitFromLoading(); // 执行View的隐藏loading方法,由Model通知 Presentervoid clearData(); // 执行Model的 清空数据方法,由View通知 Presentervoid clearTextData(); // 执行View的清空TextView内容方法,由Model通知 Presenter}

1.1、实现IPresenter接口

/*** 具体业务逻辑实现*/
public class IPresenterImp implements IPresenter {private IView view;private IModel model;@Overridepublic void setView(IView view) {this.view = view;}@Overridepublic void removeHandlerMsgAndCallback() {model.removeHandlerMsgAndCallback();}@Overridepublic void setModel(IModel model) {this.model = model;}@Overridepublic void onDataChanged(String data) {model.onDataChanged(data);}@Overridepublic void onDataChangedUpdateText(String data) {view.onDataChangedUpdateText(data);}@Overridepublic void submitFromData() {model.submitFromData();}@Overridepublic void showSubmitFromLoading(String data) {view.showSubmitFromLoading(data);}@Overridepublic void hideSubmitFromLoading() {view.hideSubmitFromLoading();}@Overridepublic void clearData() {model.clearData();}@Overridepublic void clearTextData() {view.clearFromData();}}

2、定义Model接口

/*** 数据模型接口 负责数据逻辑*/
public interface IModel extends IBaseModel {default void setPresenter(IPresenter presenter) {}  // 持有 Presenter/*** 这些都是方法,都是由 Presenter 调用的*/void onDataChanged(String data); // 监听文本变化,时时更新数据void submitFromData(); // 提交表单数据void clearData(); // 清空数据}

2.1、实现Model接口

/*** 数据模型逻辑 具体实现*/
public class IModelImp implements IModel {private String mData = "";private IPresenter presenter;private Handler handler = new Handler();@Overridepublic void setPresenter(IPresenter presenter) {this.presenter = presenter;}@Overridepublic void onDataChanged(String data) {mData = data;presenter.onDataChangedUpdateText(mData);}@Overridepublic void removeHandlerMsgAndCallback() {handler.removeCallbacksAndMessages(null);}@Overridepublic void submitFromData() {presenter.showSubmitFromLoading(mData);handler.removeCallbacksAndMessages(null);handler.postDelayed(new Runnable() {@Overridepublic void run() {presenter.hideSubmitFromLoading();}}, 1500);}@Overridepublic void clearData() {mData = "";presenter.clearTextData();}
}

3、定义View接口

/*** 视图接口 负责视图逻辑*/
public interface IView extends IBaseView {default void setPresenter(IPresenter presenter) {} // 持有 Presenter/*** 这些都是方法,都是由 Presenter 调用的*/void onDataChangedUpdateText(String data); // 根据时时数据更新TextViewvoid showSubmitFromLoading(String data); // 显示提交表单loadingvoid hideSubmitFromLoading(); // 隐藏提交表单loadingvoid clearFromData(); // 清空EditText数据}

3.1、实现View接口

/*** 视图逻辑 具体实现*/
public class MVPActivity extends AppCompatActivity implements IView, View.OnClickListener {private ActivityMvpBinding binding;private IModel iModel;private IPresenter iPresenter;private AlertDialog dialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMvpBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());iPresenter = new IPresenterImp();iModel = new IModelImp();// 注意一下,写的顺序iModel.setPresenter(iPresenter); // 持有 PresentersetPresenter(iPresenter); // 持有 PresenteriPresenter.setModel(iModel); // 持有 ModeliPresenter.setView(this); // 持有 Viewinit();}@Overridepublic void onClick(View v) {if (v == binding.submitBtn) {iPresenter.submitFromData();} else if (v == binding.clearBtn) {iPresenter.clearData();}}@Overrideprotected void onDestroy() {super.onDestroy();iPresenter.removeHandlerMsgAndCallback();}private void init() {binding.editMsg.setText("normal");binding.edit.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {iPresenter.onDataChanged(s.toString());}@Overridepublic void afterTextChanged(Editable s) {}});binding.submitBtn.setOnClickListener(this);binding.clearBtn.setOnClickListener(this);}@Overridepublic void onDataChangedUpdateText(String data) {binding.editMsg.setText(data);}@Overridepublic void showSubmitFromLoading(String data) {AlertDialog.Builder builder = new AlertDialog.Builder(this);TextView textView = new TextView(this);if (TextUtils.isEmpty(data)) {data = "normal";}textView.setText("正在提交:" + data);builder.setCancelable(false);builder.setView(textView);dialog = builder.show();}@Overridepublic void hideSubmitFromLoading() {dialog.dismiss();}@Overridepublic void clearFromData() {binding.edit.setText("");binding.editMsg.setText("normal");}}

4、IBasePresenter

/*** Base 代理接口 负责业务逻辑*/
public interface IBasePresenter {// 写一些,公用或者通用的方法,用于扩展default void removeHandlerMsgAndCallback() {} // 删除handler 回调和消息}

5、IBaseModel

/*** Base 数据模型接口 负责数据逻辑*/
public interface IBaseModel {// 写一些,公用或者通用的方法,用于扩展default void removeHandlerMsgAndCallback() {} // 删除handler 回调和消息}

6、IBaseView

/*** Base 视图接口 负责视图逻辑*/
public interface IBaseView {// 写一些,公用或者通用的方法,用于扩展default void testBaseView() {}}

7、activity_mvp.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=".ui.activity.MVPActivity"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="48dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"android:background="@color/material_dynamic_primary90"app:title="MVP" /><EditTextandroid:id="@+id/edit"android:layout_width="match_parent"android:layout_height="50dp"android:layout_marginHorizontal="16dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/toolbar" /><TextViewandroid:id="@+id/edit_msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="8dp"app:layout_constraintLeft_toLeftOf="@id/edit"app:layout_constraintTop_toBottomOf="@id/edit" /><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/submit_btn"android:layout_width="match_parent"android:layout_height="58dp"android:layout_marginHorizontal="16dp"android:layout_marginTop="8dp"android:text="submit"android:textAllCaps="false"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/edit_msg" /><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/clear_btn"android:layout_width="match_parent"android:layout_height="58dp"android:layout_marginHorizontal="16dp"android:layout_marginTop="8dp"android:text="clear"android:textAllCaps="false"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/submit_btn" /></androidx.constraintlayout.widget.ConstraintLayout>

8、源码地址

GitHub - LanSeLianMa/AndroidMVP: Android MVP 写法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORACLE P6 v23.12 最新虚拟机(VM)全套系统环境分享

引言 根据上周的计划&#xff0c;我简单制作了两套基于ORACLE Primavera P6 最新发布的23.12版本预构建了虚拟机环境&#xff0c;里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primavera销售代…

云原生|对象存储|minio分布式集群的搭建和初步使用(可用于生产)

前言&#xff1a; minio作为轻量级的对象存储服务安装还是比较简单的&#xff0c;但分布式集群可以大大提高存储的安全性&#xff0c;可靠性。分布式集群是在单实例的基础上扩展而来的 minio的分布式集群有如下要求&#xff1a; 所有运行分布式 MinIO 的节点需要具有相同的访…

亚信安慧AntDB数据并行加载工具的实现(二)

3.功能性说明 本节对并行加载工具的部分支持的功能进行简要说明。 1) 支持表类型 并行加载工具支持普通表、分区表。 2) 支持指定导入字段 文件中并不是必须包含表中所有的字段&#xff0c;用户可以指定导入某些字段&#xff0c;但是指定的字段数要和文件中的字段数保持一…

leetcode刷题记录07(2023-04-30)【二叉树展开为链表 | 买卖股票的最佳时机 | 二叉树中的最大路径和(递归) | 最长连续序列(并查集)】

114. 二叉树展开为链表 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺…

AxGlyph安装教程

AxGlyph安装教程 AxGlyph是一款用于创建科学图表的强大工具&#xff0c;以下是AxGlyph的下载和安装步骤。 步骤一&#xff1a;下载AxGlyph 访问下载地址&#xff1a;点击下载 解压安装包 步骤二&#xff1a;运行安装程序 点击AxGlyph_Setup_Win7_8_10.exe进行安装 安装完成…

FHE简介

1. 引言 加密技术已经存在了数千年&#xff0c;用于相互发送秘密信息。例如&#xff0c;凯撒密码是最早的加密技术之一&#xff0c;可以追溯到公元前60年&#xff0c;其只由字母表中的字母交换组成。 随着互联网的出现&#xff0c;人们生成的私人数据量呈指数级增长&#xff…

【Maven】下载及配置

文章目录 1. 下载2. 解压3. 配置环境变量4. 验证 Maven 是一个跨平台的项目管理工具。作为 Apache 组织的一个颇为成功的开源项目&#xff0c;其主要服务于基于 Java 平台的项目创建&#xff0c;依赖管理和项目信息管理&#xff0c;是一个自动化构建工具&#xff0c;本文将介绍…

MySQL入门教程-触发器

9.触发器 什么是触发器 触发器(trigger)&#xff1a;监视某种情况&#xff0c;并进行某种操作&#xff0c;它的执行并不是程序调用&#xff0c;也不是手工启动&#xff0c;而是由事件来触发&#xff0c;例如&#xff1a;对一张表进行操作&#xff08;插入&#xff0c;更新&…

跨进程通信 macOS XPC 创建实例

一&#xff1a;简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单&#xff0c;但是比较绕。 主要需要集成 XPC Server 这个模块&#xff0c;这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭&#xff0c; 我们主app 进…

JNPF开发平台--初体验

这一两年低代码的概念很流行&#xff0c;我也在网上了解体验了一番。 目前低代码主要分为两种&#xff0c;第一种是与云平台绑定的低代码&#xff0c;在云平台上开发&#xff0c;直接发布到云平台&#xff1b;第二种是低代码框架&#xff0c;低代码项目&#xff0c;这种比较流行…

C# 使用ZXing.Net生成二维码和条码

写在前面 条码生成是一个经常需要处理的功能&#xff0c;本文介绍一个条码处理类库&#xff0c;ZXing用Java实现的多种格式的一维二维条码图像处理库&#xff0c;而ZXing.Net是其.Net版本的实现。 在WinForm下使用该类库需要从NuGet安装两个组件&#xff1a; ZXing.Net ZXing…

当钉钉宜搭有销售单据或客户审批时,自动同步到畅捷通T+Cloud,赋能企业部门之间的业务流程自动化

1 场景描述 随着数字化转型&#xff0c;对于大规模的企业来说&#xff0c;都会选择低代码系统来搭建内部流程来提高公司的管理效率&#xff0c;例如使用钉钉宜搭作为企业的数据库&#xff0c;用来存储客户、供应商、单据等数据。也会使用畅捷通TCloud作为ERP系统解决管理财务、…

Github 2023-12-30 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-30统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目4JavaScript项目2C项目1Python项目1Java项目1HTML项目1Dart项目1非开发语言项目1 令人惊叹的 …

【51单片机系列】DS1302时钟模块扩展实验之与EEPROM结合使用只进行一次初始化工作

本文是关于时钟芯片DS1302的扩展实验。 文章目录 一、实验分析二、proteus仿真原理图三、软件设计及结果 本实验实现的目的&#xff1a;利用AT24C02掉电不丢失的功能&#xff0c;存储数据用来辨别DS1302时钟是否已经初始化&#xff0c;如果初始化就不执行DS1302初始化函数。 一…

ansible_角色的使用

本章主要介绍ansible中角色的使用 了解什么是角色独立地写一个角色使用角色系统自带角色地使用 1.了解角色 正常情况下&#xff0c;配置一个服务如 apache时&#xff0c;要做一系列的操作:安装、拷贝、启动服务等。如果要在不同的机器上重复配置此服务&#xff0c;需要重新执…

新品出击 | 软网关BLIoTLink免费发布

新品出击|软网关BLIoTLink免费发布 BLIoTLink是一款免费的物联网协议转换软件&#xff0c;可以部署在任何基于Linux OS的系统&#xff08;Linux、Debian、Ubuntu、FreeRTOS、RT-Thread&#xff09;中&#xff0c;使用灵活&#xff0c;可以实现数据的采集以及接入网络平台。 BL…

ssm基于JavaEE的智能实时疫情监管服务平台的设计与实现+jsp论文

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套智能实时疫情监管服务平台有管…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《面向平稳氢气需求的综合制氢系统鲁棒优化配置方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到针对平稳氢气需求的综合制氢系统鲁棒优化配置方法。让我们逐步解读这个标题的关键要素&#xff1a; 面向平稳氢气需求&#xff1a; 这部分指…

k8s之kudeadm

kubeadm来快速的搭建一个k8s的集群&#xff1a; 二进制搭建适合大集群&#xff0c;50台以上主机 kubeadm更适合中小企业的业务集群 master&#xff1a;192.168.233.91 docker kubelet lubeadm kubectl flannel node1:192.168.233.92 docker kubelet lubeadm kubectl flannel…

Gin 源码深度解析及实现

介绍 什么是 gin &#xff1f; 一个轻量级高性能 HTTP Web 框架。 Introduction | Gin Web Framework (gin-gonic.com) Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API&#xff0c;但性能比 Martini 快 40 倍。 为什么使用 gin &#xff1f; In…