android数据流分类,【Android工程之类】1 MVVM架构 - MVVM与单向数据流

前言

这个系列将讲述使用MVVM架构、LiveData、Room、Kodein、Retrofit、EventBus来建立一个统一的、优雅的、可维护的TODO程序,本系列分为多个章节,从0开始一步一步引入这些优秀的库。下图展示的是Jetpack组件库包含的内容,这套的架构方案的核心就是谷歌现在大力推荐的Jetpack作为基础,搭配外围脚手架补齐Jetpack短板,还原原汁原味的优雅Android。

42d6b7f6fc5143772bf695ccd33133e8.png

多说一句,确保团队对架构有统一的理解是非常必要的,就好比开团要切adc一样自然,如此不论是bug修复还是功能开发都无需抽丝剥茧就能直接定位完成任务。

目录

• MVVM架构 - MVVM与单向数据流

• LiveData - 使用ViewModel绑定UI和点击事件

• EventBus - 全局事件分发

• Room - 丝滑的sqlite访问

• Retrofit - 丝滑的api接入

• Kodein - 引入依赖注入优雅生成ViewModel

• Service - 使用eventbus包装与service的通信

• Receiver和定时任务 - 安装卸载事件 各种manager的处理

• 低内存 - 组件被回收的正确处理

• Navigation - 优雅的Single Activity导航组件

• Paging - 分页组件

复制代码

本系列我们以构建一个TODO APP为例,逐步分析这些这套架构是如何发挥作用的。首先看看Android开发者官网上的MVVM架构图。

这里强调一点,使架构干净整洁的精髓就是保持数据流单向流动。

763be3890f4f209d0951c9c641e8a3bd.png

• Activity / Fragment

View层,在这一层里,不要放和业务逻辑相关的任何代码,只编写处理UI逻辑的代码和函数,供ViewModel调用。当然,ViewModel是不能直接调用activity的,否则就破坏了单项数据流了,这里可以使用接口的方式把activity中的方法传入viewModel,当然更好的方式是使用EventBus进行事件分发。

• ViewModel

保存UI相关的变量,可以与layout中的元素进行单向或双向的数据绑定。响应元素的onlick等事件,调用Repository完成任务,更改UI属性值,调用传入的回调接口或向eventbus发送事件来反馈用户操作是成功还是失败。ViewModel可以被多个Activity共享。

• Repository

对多个数据源的统一封装,形成统一方法,比如有saveUser(user: User)方法,内部调用远程api接口保存成功后,写入本地数据库,函数成功返回,但对调用者来说抽象了数据源的实现方法,减少上层逻辑处理负担。

• Model / Local Data Source

本地数据源抽象层

• Remote Data Source

远程数据源抽象层

复制代码

但是,我们的应用一般不可能这么简单,还会应用到service、receiver、后台进程什么的,这里为了简单起来,先不加入,等到后面对应的章节再补充进去。

起步

说了这么多废话,动手创建工程吧

工程创建

首先常规操作,创建一个名叫todo的工程

在module的build.gradle中加入

android {

...

dataBinding {

enabled = true

}

}

dependencies {

...

// architectures

implementation"androidx.lifecycle:lifecycle-viewmodel-ktx:$archLifecycleVersion"

implementation"androidx.lifecycle:lifecycle-livedata-ktx:$archLifecycleVersion"

implementation"androidx.lifecycle:lifecycle-extensions:$archLifecycleVersion"

}

复制代码

在project的build.gardle文件中统一声明版本

ext{

archLifecycleVersion='2.2.0'

}

复制代码

ViewModel创建

好了,一切就绪,我们首先建立我们的viewmodel,并声明一个hello字段,LiveData是个抽象类,我们使用MutableLiveData建立一个private的实例对象,并将其赋值给hello暴露给外部。

这里hello我们给个默认值"hello",该值可空,默认为null

class MainViewModel: ViewModel() {

val _hello = MutableLiveData("hello")

val hello : LiveData = _hello

}

复制代码

在layout中绑定ViewModel

接下来修改layout文件,打开默认创建的layout文件,将其用layout标签包裹并加入data块,声明变量名为viewmodel,变量类型是刚才创建的class。viewmodel建议全小写,可以在activity中定义的viewModel区别开。

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools">

name="viewmodel"

type="xyz.yuanxiaoqing.todo.MainViewModel" />

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@{viewmodel.hello}"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent" />

复制代码

在textview中我们使用@{}语法将其单向绑定到hello变量上

MainActivity

好了,最后一步,将viewmodel实例化绑定到layout中。这里直接实例化了MainViewModel,仅作为演示,后面章节将介绍如何优雅生成这个对象。这个ActivityMainBinding是什么?他是Android Studio自动根据R.layout.activity_main生成的Binding对象。

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

val binding: ActivityMainBinding =

DataBindingUtil.setContentView(this, R.layout.activity_main)

val viewModel = MainViewModel()

binding.apply {

viewmodel = viewModel

}

}

}

复制代码

2bcc479acb3b5b7a5bbffa4c048df281.png

ok,成功绑定。

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

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

相关文章

java ssl证书_Java安全教程–创建SSL连接和证书的分步指南

java ssl证书在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程。 如我们之前的文章中所述, 安全套接字层(SSL)/传输层安全性(TLS)将启用…

android运行的线程中,android中线程是否运行在单独的进程中?

android sdk中的描述Caution:Aservice runs in the main thread of its hosting process—the servicedoesnotcreateits own thread anddoesnotrunin a separate process (unless you specify otherwise). This meansthat, if your service is going to do any CPU intensive w…

通过Okta的单点登录保护Spring Boot Web App的安全

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 您可以使用SpringBoot和Okta在不到20分钟的时间内启动具有完整用户身份和授权管理的企…

java ee cdi_Java EE CDI程序化依赖关系消歧示例–注入点检查

java ee cdi在本教程中,我们将看到在注入Java EE CDI bean时如何避免程序依赖消除歧义。 我们已经在Jave EE依赖关系消除歧义示例中展示了如何避免CDI Bean中的依赖关系歧义消除。 在这里,我们将向您展示如何以动态方式避免依赖消除歧义。 我们将通过检查…

在EL表达式中引用ADF Faces组件

EL表达式通常用于在页面上指定ADF Faces组件的属性值。 有趣的是,我们可以使用component关键字来引用要为其评估EL表达式的组件实例。 这是略与此类似Java中。 例如,在以下代码段中,按钮的提示被评估为按钮的文本值,并且它的visi…

atom自动补全html代码,Atom - Emmet插件的使用详解(HTML/CSS代码自动补全)

一、Emmet的安装与介绍Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的工具,能够实现 HTML、CSS 的快速编写。官网地址:http://emmet.io/官方文档:http://docs.emmet.io/cheat-sheet/Atom的emmet介绍页面:https://at…

html怎么做出相框的效果,PS滤镜制作漂亮的实木相框效果

一、新建一个600 * 800像素的文件,然后新建一个图层,前景颜色设置为红色,背景设置为深红色,执行:滤镜 > 渲染 > 纤维,参数设置如下图。二、执行:图像 > 旋转画布 > 逆时针90度&…

crawler4j_迷你搜索引擎–使用Neo4j,Crawler4j,Graphstream和Encog的基础知识

crawler4j继续执行正在实现搜索引擎的Programming Collection Intelligence (PCI)的第4章。 我可能比做一次运动所咬的东西要多。 我认为,与其使用本书中所使用的常规关系数据库结构,不如说我一直想看看Neo4J,所以现在…

html图片显示原始大小,我如何使PHP / HTML图像在单击时显示原始大小?

如果您要使用纯JavaScript,则可以设置onclick事件侦听器并获取图像的实际大小(确定图像在浏览器中的原始大小吗?),然后将此大小设置为image。(如果您希望第二次单击将其设置为旧尺寸,请将旧尺寸保存到全局变量中,然后进…

OWASP依赖性检查Maven插件–必须具备

我不得不非常遗憾地承认,我对OWASP依赖检查maven插件一无所知。 自2013年以来似乎已经存在。显然GitHub上已有千个项目正在使用它。 过去,我手动检查了依赖项,以根据漏洞数据库对其进行检查,或者在很多情况下,我只是完…

html数据填充,JS使用模板快速填充HTML控件数据

图片 图片名称 类型 大小 尺寸 上传日期 操作

html selsec 文字靠右,EDA课程设计

计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。Altera Quartus II 作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。设计原理多功能…

Spring Data Solr教程:将自定义方法添加到单个存储库

我的Spring Data Solr教程的前一部分教我们如何使用查询方法创建静态查询。 自然而然的下一步将是描述如何使用Spring Data Solr创建动态查询。 但是,在继续讨论该主题之前,我们必须了解如何将自定义方法添加到单个存储库。 这篇博客文章将帮助我们了解如…

html用c 绑定sql,HTML、SQL、C++及C综合测试六(含答案).pdf

1、在HTML 文档中,标签的( )属性可以创建跨多个行的单元格 (选择一项)A、COLSPAN B、ROW C、ROWSPAN D、SPAN2、当安装完SQL Server2005数据库时,系统默认当前的超级管理员是( ) (选择一项)A、sa B、master C、administrator D、super3、某C#中的main()方法如下所示,则编译运行…

基于Spring的应用程序-迁移到Junit 5

这是有关将基于Gradle的Spring Boot应用程序从Junit 4迁移到闪亮的新Junit 5的快速文章。Junit 4测试继续与Junit 5 Test Engine抽象一起工作,该抽象为在不同编程模型中编写的测试提供支持。例如,Junit 5支持能够运行JUnit 4测试的Vintage Test Engine。…

查询阜阳2021高考成绩,2021年阜阳高考成绩排名及成绩公布时间什么时候出来

阜阳高考结束后,每年都有很多家长和考试不知道阜阳高考成绩排名如何查询、阜阳高考成绩什么时候公布以及查询方式,本文小编整理了阜阳高考成绩查询排名的相关知识。一、阜阳高考成绩公布时间及查询方式根据往年阜阳高考成绩公布时间预测,2021…

martin fowler_用Java和Java 8创建内部DSL,采用Martin Fowler的方法

martin fowler目前,我正在阅读Martin Fowler撰写的有关DSL- 特定领域语言的精彩书籍。 围绕DSL的嗡嗡声,围绕轻松支持DSL创建的语言,以及DSL的使用,使我好奇地了解和学习DSL的这一概念。 到目前为止,这本书的使用经验令…

2021高考厦门一中成绩查询,2021年厦门中考成绩和分数线什么时候公布(附查询入口)...

每年中考结束后很多考生和家长都很关心成绩什么时候公布,中考分数线什么时候公布?然而你离彻底解放就只差一步——查分数!查分数,比上考场考试还要紧张啊!考分不知道,玩耍似心跳。那么2019年厦门中考成绩什…

Java开发人员应该知道的前20个库和API

优秀且经验丰富的Java开发人员的特征之一是对API的广泛了解,包括JDK和第三方库。 我花了很多时间来学习API,尤其是在阅读了Effective Java 3rd Edition之后 ,Joshua Bloch建议在Java 3rd Edition中使用现有的API进行开发,而不是为…

计算机桌面文字重影,电脑桌面字有重影怎么办

1.电脑字体重影怎么办可以尝试以下4种方法:1. 右击“我的电脑”,依次单击“属性/高级/性能设置”在“视觉效果”页中将“在桌面上为图标标签使用阴影”选中,单击确定即可。2. 右键桌面空白处右击,在“排列图标”里去掉“锁定桌面的…