android中实现登录功能实现原理,用一个最简单的登录例子来了解Android的MVC和MVP架构的原理和实现...

2023-11-05

在目前的Android开发中,MVP与MVC架构还有MVVM都非常流行,三者在不同的场景下都有各自的优势和劣势,一般而言会根据具体的业务场景来选择不同的模式,所以并不是说开发一个App一定完全遵循那种模式,完全可以根据业务场景不同混合多种模式。

从概念上讲,MVP和MVC虽然都含有Model和View,但是Model和View的职责并不相同。下面是MVC和MVP的结构示意图

a91de239061a

image.png

a91de239061a

image.png

在MVC中,箭头的方向A->B可以简单的理解为A在代码中出现了B,例如Controller->Model,可以理解为Activity有一个成员变量User,ControllerView可以理解为activity中有一个成员变量textview,textview也持有context(activity)这个对象。

而在MVP中,View和Model完全分离,通过中间的Presenter来传递消息。

Android的MVC并不是严格标准的MVC。

在Android中,通常而言M指的是数据模型(model类),V指的是XML文件和各种View组件,Controller则是Activity,Fragment这些带有生命周期的具体业务类。可是,Activity天生并不适合做Controller,因为View一定会在Activity中进行绑定(findviewbyid),所以Activity不可避免的还要做一些MVC中View的工作。因此,在Android的MVC中,Activity即是View又是Controller。这就导致了在一个业务复杂的Activity中,存在一大堆业务代码和UI控制代码,显的很臃肿,不利于维护和测试。

MVP可以很好的解决这个问题,在MVP中,我们就让Activity做一个纯粹的View,把具体的业务都剥离出去让Presenter做,每一个Presenter做不同的业务,这样就很方便维护和测试。

拿一个非常简单的登录界面来讲,我们现在要完成一个简单的业务,输入账号密码登录。

我们要完成四个功能:密码为空给出提示,账号为空给出提示,登录失败给出提示,登录成功显示欢迎xxx。

a91de239061a

login.gif

首先是使用MVC来完成这个业务,Api是一个模拟登录Api的类,SimpleDialog简单的封装了Dialog,可以忽略这些,具体代码可到文章末尾github地址查看。

在这个Activity即Controller中,持有了Model和一些View,同时Controller也做了部分View的工作。

a91de239061a

image.png

再来是MVP模式,一个最简单的MVP模式由IView接口类(定义界面什么时候改变),Presenter(具体业务)和一个Activity(界面显示+控制)组成,如下面三张图的代码所示。

我们发现,在这个MVP模式的Activity中,Api的请求没有了,非法账号密码的判断也没有了,而且Activity不再持有model类(user对象),activity只调用了presenter的具体业务方法,然后这些全由presenter负责,Activity现在看起来完全是一个View,只管怎么显示界面。

a91de239061a

image.png

当presenter完成业务后,势必要通知Activity对UI进行更改,我们定义了一个ILoginView接口,它确定了有哪些情况需要更改View,非常清晰。下面是ILoginView的代码,这四个接口分别是登录成功后ui的更改,因为登录成功后需要显示用户名字,所以传递了String的参数,其余三个为登录失败,非法的密码和非法的账号ui更新接口,根据业务的需要可以扩充这个接口和参数。

a91de239061a

image.png

接下来看看最神奇的presenter类,其实presenter也并没有那么神奇,仅仅是把MVC中activity的业务代码挪到了这里面,在这个presenter中,一定要传入ILoginView这个接口,同时现在他持有了Model(即user对象)而不再是Activity持有User,在LoginPresenter完成登录业务后,调用IlongView接口来通知Activity更改页面。

a91de239061a

image.png

现在回过头去看最初的结构图,应该能大致明白MVP的结构了吧。

MVP的好处就是剥离一个个业务,想象一下如果在这个界面增加注册,找回密码等业务,只要多增加几个presenter就可以了,而传统的MVC,把所有代码挤在Activity里,整个Activity是不是已经显的臃肿不堪。

项目地址

https://github.com/ccyzml/LoginCaseOnMVPMVC

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android中实现登录功能实现原理,用一个最简单的登录例子来了解Android的MVC和MVP架构的原理和实现... 的相关文章

  • List从服务器取文件名乱码,急用!!!为什么list程序输出会乱码??

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 window 15 2 78 23 textbackground LIGHTGREEN textcolor LIGHTMAGENTA clrscr gotoxy 1 3 printf Delet
  • Android学习笔记(一)——Activity基础知识

    Activity基础知识 Activity 活动 是一种可以包含用户界面的组件 一个应用程序可以包含多个活动 Android项目中逻辑和试图分离 每个活动最好对应一个布局 布局是用来显示界面内容的 Activity和布局文件如何关联起来 在
  • PyTorch基础-交叉熵函数mnist数据集识别-04

    交叉熵 代码 import numpy as np import torch from torch import nn optim from torch autograd import Variable from torchvision i
  • Spring框架详解(三)

    一 代理模式 代理模式 为一个对象提供一个替身 以控制对这个对象的访问 即通过代理对象访问目标对象 这样做的好处就是 可以在目标对象实现的基础上 增强额外的功能操作 即扩展目标对象的功能 被代理对象可以是远程对象 创建开销大的对象或者是需要
  • 批量上传图片

    前端使用jQuery完成图片的上传 后端使用Java接收图片文件 具体实现步骤 使用HTML和CSS进行页面的布局 并引入jQuery库 使用三个input标签 类型均为type file 的标签 并命名好相对应的id 这个id可以命名的有
  • 数睿通2.0功能发布—集成Doris、数仓动态配置、质量任务完善、接入速度优化

    文章目录 引言 集成 Doris 数仓动态配置 质量任务完善 接入速度优化 结语 引言 数睿通 2 0 数据中台迎来了 6 月份的更新 本次更新集成了 Doris 数据库 可用于数据集成 数据开发等模块 过去数仓使用的是 TiDB 新版本可
  • python获取浏览器 cookies

    python 获取浏览器 cookie代码 import browser cookie3 dict1 browser cookie3 chrome domain name baidu com print dict1 s for u in d
  • 【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!!让iphone越狱用户无从下手!!!

    转载自 黑米GameDev街区 原文链接 http www himigame com iphone cocos2d 673 html 对于iOS的应用安全这块主要有两块是我们开发者可以避免的 一个是存储数据加密 这个在上一篇文章Himi介绍
  • Springboot+Shiro+Jwt实现权限控制

    前置背景 为什么写下这篇文章 因为需要实现一个设备管理系统的权限管理模块 在查阅很多博客以及其他网上资料之后 发现重复 无用的博客很多 因此写一篇文章来记录 以便后面复习 涉及的知识点主要有下列知识点 JWT shiro 书写顺序 首先使用
  • 好库推荐

    本文参考自下面的文章 略有修改 https blog csdn net qq 42279077 article details 123853166 项目地址 https github com wangluozhe requests 它是go
  • 双向数据绑定v-model与v-decorator

    数据绑定 1 单向数据绑定 将数据写在html结构中 然后进行渲染 一旦HTML代码生成好后 就没有办法再进行改变了 如果有新的数据出现 那就必须要先把之前的HTML代码删掉 然后重新把新的数据和模板一起整合形成新的HTML代码 再插入到文
  • log4j2源码解析(2.2版本)

    消减浮躁静下心来 听一听生活的声音 流水的声音 风吹树叶的声音 呼吸的声音 让我真的很舒服 目的 搞懂下面这两行代码到底是怎么打印出日志的 private static final Logger logger Logger getLogge
  • linux信号通信总结

    http www ibm com developerworks cn linux l ipc part2 index1 html http www ibm com developerworks cn linux l ipc part2 in
  • mybatis-plus报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    翻译一下报错 Invalid bound statement not found 无效的绑定语句 未找到 就是说你的xxxMapper接口与xxxMapper xml文件在做映射绑定的时候没有成功 也有可能是xxxMapper接口中的方法无
  • Vue项目一键打包

    前端vue项目总是要手动打包 累 于是写了一个批处理简化这个过程 红色部分为项目本地地址 下面还有压缩软件安装地址 需要自己修改 压缩包软件这里使用的7z 打包地址为批处理文件所在目录 echo off 设置项目地址 set item D
  • jmeter集合点设置

    针对课程签到做并发 2个要素 1 作用域 这里针对是课程签到的并发 添加的定时器就在课程签到的下面添加 2 选择元件 Synchronizing Timer 通过sample11 15 可以看出 课程签到都在10 09 54同时并发 毫秒忽
  • java 数据结构-------串

    串是若干个字符组成的有限序列 大部分的软件系统都会频繁使用串 串也是一种线性结构 和线性表不同的是 串的操作特点是一次操作若干个数据元素 即一次操作一个字符串 串通常采用顺序存储结构存储 模式匹配是串的一个非常重要的操作 但是模式匹配的时间
  • element-ui 表单验证只验证一项或者去掉某一项的验证?

    如何单独验证表单中的某一项 this refs form validateField phone errMsg gt if errMsg console log 手机号校验未通过 else console log 校验通过 如何去掉某一项的
  • vue项目开发 实现自定义Transfer穿梭框效果(结合el-tree)

    vue项目开发 实现自定义Transfer穿梭框效果 结合el tree 效果图 实现代码 效果图 实现代码 直接上代码 An highlighted block

随机推荐

  • event.preventDefault();

    event preventDefault 阻止默认行为 例如 为复选框注册click事件 事件中执行e preventDefault 后 复选框将不会被选中
  • 小白快速搭建网站

    小白快速搭建网站包含宝塔 1 购买域名 登录阿里云 gt 域名 gt 域名注册 2 购买服务器复制公网ip 3 域名解析 开放端口号 宝塔所需端口号 20 21 39000 40000端口 linux 系统 3000 4000 window
  • SSH安全防护

    SSH 用于安全访问远程服务器的协议 一 密码登录工作原理 服务器启动时 自己产生了一个密钥 768bits公钥 本地ssh客户端发送连接请求到ssh服务器 服务器检查连接点客户端发送的数据和ip地址 确认合法后发送密钥 768bits 给
  • opengl 先旋转后平移和先平移后旋转解惑

    我们知道 在opengl中 如果模型中点不在原点 先平移后旋转会导致模型的位移发生变化 但在项目中遇到这么一个问题 如果不知道模型中点 或者知道模型中点一定不在原点 但我们也只需要模型方向 那么我们直接将模型旋转会得到我们想要的方向吗 即如
  • bugku--never_give_up

    考察知识点 1 对编码的敏感度 2 php伪协议 以及POST流 3 通配符 4 弱比较 初步工作 进入页面 是这个样子 查看源代码 发现有提示 那我们访问 ip 1p html 我这里就是http 114 67 175 224 10713
  • r语言 整理、处理数据步骤_R语言万能数据清洗整理包Tidyverse(一)

    数据整理和清洗是任何统计分析的前提 也是最为困难的一个环节 很多软件也提供了数据整理和清洗的功能 甚至连我们常用的EXCEL也可以做这个工作 但是效率很低 而且容易出错 且无法完整保存清洗过程 R语言作为一种开源语言 在这个方面还是很有优势
  • 黑盒测试的测试方法及其案例

    黑盒测试案例设计技术 测试用例 测试用例对测试的作用 黑盒测试 什么是黑盒测试 测试方法 等价类划分法 概念 划分等价类的原则 例题 等价类扩展 边界值分析法 概念 选择测试用例的原则 例题 错误推测法 概念 因果图法 因果图法是什么 利用
  • 2022年高教社杯全国大学生数学建模竞赛解题思路

    2022年高教社杯全国大学生数学建模竞赛试题和最新解题思路 文末可领取各题最新的解题思路和方法 1 试题 A 题 波浪能最大输出功率设计 随着经济和社会的发展 人类面临能源需求和环境污染的双重挑战 发展可再生能源产业已成为世界各国的共识 波
  • java开发常用代码

    基础类型转换 https www cnblogs com expiator p 12602446 html BigDecimal计算 涉及金额之类的运算 不要用 Double Float 这些类型 用 BigDecimal 才能精确计算 详
  • Tensorflow: Model parallelism 模型并行计算

    在tensorflow官方tutorial上给出了多GPU的用法 但那是基于data parallelism的计算 主要思想是将数据划分成不同部分 用同一个模型进行计算 但是我在写代码中发现 会出现单个模型过大无法再单个GPU上运行 这时候
  • JAVA的三大特征之多态

    多态 什么是多态 多态就是同一个行为的不同表现形式 换句话说就是同一个方法因为对象的不同所产生不同的结果 多态存在的条件 继承 重写 父类引用指向子类对象 例 public static void main String args a是人的
  • iOS面试小贴士

    最全的iOS面试题及答案 iOS面试小贴士 回答好下面的足够了 多线程 特别是NSOperation 和 GCD 的内部原理 运行时机制的原理和运用场景 SDWebImage的原理 实现机制 如何解决TableView卡的问题 block和
  • jQuery的Ajax操作小结——$.ajax和$.getJSON等用法小结

    一 ajax用法与举例 jQuery ajax url settings 返回值 XMLHttpRequest 通过 HTTP 请求加载远程数据 这个是jQuery 的底层 AJAX 实现 简单易用的高层实现见 get post 等 最简单
  • 你们公司的【前端项目】是如何做测试的?字节10年测试经验的我这样做的...

    前端项目也叫web端项目 通俗讲就是网页上的功能 是我们能够在屏幕上看到并产生交互的体验 前端项目如何做测试 要讲清楚这个问题 先需要你对测试流程现有一个全局的了解 先上一张测试流程图 测试流程图 接下来下面我们从需求阶段 开发阶段 测试阶
  • vivo的Android升级包,【原厂固件】vivo y66ia系统升级rom刷机包_卡刷包_PD1621B_A_1.9.6...

    今天小编跟大家分享下vivo Y66iA手机固件rom的刷机教程 此版本固件主要是优化了系统安全性 及系统运行的稳定性以及与一些第三方App的兼容性 版本区分方法如下 请在打开手机设置 关于手机 版本里看看是PD1621B A字样 然后下载
  • (解决方案) node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28‘ not found (node required by node)

    您可能会遇到安装在 ubuntu 操作系统上的 NodeJS 问题 当您运行 node v或pm2 list 命令时出现错误 node lib x86 64 linux gnu libc so 6 version GLIBC 2 28 no
  • 编写shell脚本实现tomcat定时重启的方法

    我的环境是 centos 7 1 在某个目录新建一个 sh 脚本文件 一般cron安装在var spool cron这里 于是我就将脚本创建在这 vim var spool cron tomcatStart sh 2 在 tomcatSta
  • 数据结构复习总结

    第一章 绪论 这里介绍了数据结构的基本概念和术语 以及算法和算法时间复杂度的分析方法 主要内容如下 1 数据结构是一门研究非数值计算程序设计中操作对象 以及这些对象之间的关系和操作的学科 2 数据结构包括两个方面的内容 数据的逻辑结构和存储
  • 挖矿kdevtmpfsi病毒处理

    通过top命令可以看到kdevtmpfsi导致CPU 700 多 导致该病毒只要是通过redis漏洞进来的 1 该病毒还有守护进程 如果光kill掉该病毒 过段时间又起来的 守护进程 kinsing 2 该病毒还有定时任务 如果光杀死kde
  • android中实现登录功能实现原理,用一个最简单的登录例子来了解Android的MVC和MVP架构的原理和实现...

    在目前的Android开发中 MVP与MVC架构还有MVVM都非常流行 三者在不同的场景下都有各自的优势和劣势 一般而言会根据具体的业务场景来选择不同的模式 所以并不是说开发一个App一定完全遵循那种模式 完全可以根据业务场景不同混合多种模