甚至,接口的表现形式是一种 语言
。
接口被定义时,其表意即已固定,当其表意:
-
越倾向于
现实表达
时,呈现为声明式
-
越倾向于
执行过程
时,呈现为命令式
User Interface 的简称,直译为用户界面
UI系统需要处理两个范畴的事情:
-
内容呈现、反馈
-
用户交互
另外,还需要程序 构建
出UI。
我们需要从这 三个角度
来看。
我们在Android原有的知识领域中看这个问题。
我们知道,这部分内容设计时是遵守 OOP 的,存在一整套 View 类簇
。而界面由具体的功能类组建出 视图树
。
我们需要讨论的,就是 视图树
的 构建
。我们知道:
ViewGroup
存在一系列addView
方法,通过它们,最终实现树结构
这套 接口
,倾向于 执行过程
,直接使用这套接口去构建,就是 命令式
的构建。
而在此基础上,封装了 LayoutInflater
,将 xml语法
表达的 结构树
转换为 视图树
, 此时我们使用的 接口
,其表现形式是 xml语言
。
按照特定的规则,我们 直接描述
了 期望的结果
,这更倾向于 现实表达
,这样的构建方式,就是 声明式
View
存在一系列的布局属性
,一些直接持有,一些被LayoutParams封装而间接持有。
在 视图树
的节点构建过程中,还需要处理 布局属性
。
按照刚才的讨论,我们很容易得出:
-
直接使用
View的API
或者LayoutParams的API
,或者直接对属性赋值,可以断言是命令式
范畴。 -
而在布局文件中,声明对应的属性值,可以断言是
声明式
范畴
小结:本段内容,我们讨论了构建UI的两种做法。并讨论了其所属的范畴。
在最基础的内容中,讨论 内容呈现
和 交互
部分使用的API,是 命令式
的,还是 声明式
的,这 非常的无聊
。
内容呈现时的 命令式 与 声明式
在 View
提供的 接口
中,例如:
-
TextView#setText(Charsequence cs)
-
ImageView#setImageDrawable(Drawable d)
等,更加偏向于 执行过程
。
但是注意,此时 执行过程
和 现实表达
的界限已经有点模糊了 。我们不必 牵强附会
。
读一下这两句话:
-
我们通过调用相应API设置了需要显示的内容
-
我们在布局文件中指明了视图显示时需要呈现的内容
交互时的 命令式 与 声明式
我们知道,Android View 体系中,封装了一系列 Listener
,通过 接口回调
,让程序可以 监听
到用户发出的 交互指令
。
除此之外,在 最基础内容
中,仅有简陋的 click
属性可以声明点击事件的 消费函数
此时,我们 放大着眼点
。我们处理视觉呈现和交互时,面向的两个重要对象
信息展示
| ================ |
| 内容呈现 |/
|=| |=|
| 实体 | | UI |
|=| |=|
/|\ 交互 |
| ================ |
状态变更
复制代码
这两者之间存在两条线:
-
代表信息
的实体
->UI
, 这是内容呈现
,实质是:在UI上做信息展示
-
UI
->代表信息
的实体
,这是交互
,实质是:在信息实体上做状态变更
,即变更信息
我们在实现这两条线时:
-
如果
直接利用
了倾向于现实表达
的高阶框架封装,那这个框架就是声明式
的框架; -
如果仅使用
低阶
的view层api
,自行实现了逻辑,那就是命令式
的编程,毕竟也没用啥框架;
评价一套
UI工具体系
是否是声明式
的,要从这三个方面看,如果在三个方面均进行了封装,提供的接口
都偏向于现实表达
,那是成熟完善的声明式UI
框架。
看几个例子:
-
直接使用
View体系的接口
构建UI、处理显示和交互,这是命令式编程
-
使用
LayoutInflater
工具和xml表达的布局文件
。绝大多数情况下,还需要通过映射关系
,找到View对象;并进一步根据业务逻辑
,操作View对象
实现内容呈现和交互逻辑。 这是声明式构建
,命令式编程
处理显示和交互。这套工具并不是完善的声明式UI开发工具
-
使用
LayoutInflater
工具 +DataBinding工具包
和xml表达的布局文件
。DataBingding
+LayoutInflater
是一套完善的声明式UI框架
-
Compose
,完善的声明式UI框架
很大一方面是Java语言特性的原因,最开始,都是使用Java语言编写业务逻辑,而基于Java,很难直接定义DSL
注:
Java语言很难直接定义DSL
这一点我并没有做严格的调研考证,如果有谬误,请指出。
而基于Groovy等语言开发符合
DSL
的声明式UI框架
,必然要引入Groovy,这在当时也和主流
格格不入,虽然Google很喜欢创新。
所以,官方提出了 布局
和 业务
分开,这样也有很多好处:
-
业务逻辑的
模块内聚性
和复用度
可提升 -
开发者可以提升专注度
-
xml树
和view树
之间关系明了
,借助成熟内容,快速开发出预览工具
因为使用XML布局的方式存在 先天弱点
,它和 业务逻辑
天生生活在两个世界。
这意味着,必然存在一个 加载器
或者 转换器
,在 运行时
或者 编译时
,将 xml语法
所描述的 声明式布局
转换到 业务逻辑
所在的世界。
所以,并不是 DataBinding
这一 声明式UI框架
不够优秀,而是 xml 和 业务逻辑代码 之间天生的屏障不够 人道主义
。
而推行 kotlin first
也有一段时间了,基于kotlin,开发 DSL
工具包非常的方便。
这也是 Modern Development 中非常热门的一个词,响应式
是对特点的一种描述,方法论是:事件驱动,Event-Driven
,发布订阅者模式
。
这个概念,和前面提到的 声明式UI框架
和 命令式UI编程
没有必然的联系,它所表达的是: 代表信息的实体
和 UI
之间的互操作是符合 响应式
特征的。
但可以想象,要实现响应式,其接口变现特征,天然倾向于 现实表达
;如果是倾向于 操作过程
,可以断言其抽象程度非常低。
再看到这些说法,我们可以判断出它们存在 谬误
:
- 基于xml无法实现声明式UI
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://img-blog.csdnimg.cn/img_convert/6d3516e386d0fb8a571ef3c77819d5f1.jpeg)
尾声
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
进阶学习视频
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
[外链图片转存中…(img-rWeBh9Y9-1713449398188)]
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-vQ1HPwXx-1713449398189)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!