我对“状态”与“事件”的理解
最近在业务开发中,对“状态”和“事件”两个概念有些思考,在这里记录一下。
从LiveData的“问题”说起
在 androidx 的 LiveData 和 ViewModel 库刚推出的时候,我也在业务中接入使用,并有了一些思考,可参见之前的文章。
最近在业务开发中,对“状态”和“事件”两个概念有些思考,在这里记录一下。
在 androidx 的 LiveData 和 ViewModel 库刚推出的时候,我也在业务中接入使用,并有了一些思考,可参见之前的文章。
在刚开始安卓开发的时候,前辈教导我:如果视图渲染出现了什么问题,就把硬件加速关掉。这确实让我绕开了不少显示上的问题。在后面的需求开发中,正好碰到了一个功能点:需要使用一个图片作为蒙层(称为蒙层图片),实际图片(称为内容图片)需要只在蒙层图片有不透明像素的地方显示,以实现对图片的特殊裁剪效果。
在 RecyclerView
中,使用 ItemDecoration
来添加分割线或者侧边装饰条是十分常用的操作,可以实现分割线、装饰条的实现与列表元素解耦,和跨列表元素之间的装饰交互。
但是, ItemDecoration
的画面显示实现是需要开发者自己覆盖 onDraw
方法,在卡片之外自行将画面元素绘制上去。因其绘制过程与卡片本身没有关系,可以想象到的是,卡片在动画过程中不会自动地影响到 ItemDecoration
中所绘制的元素,需要开发者进行额外的适配工作。
平时在安卓项目中需要编写 xml 布局时,我都习惯需要接收 drawable
资源的属性中( 如 android:background
)可以按需传入 drawable
资源 ( 如 @drawable/layout_bg
) 和 color
资源 ( 如 @color/layout_bg_color
),并且默认在 xml 资源中 color 资源是可以代替 drawable 使用的。
目前在维护的项目中,有很多页面的代码比较久远,将网络请求、数据处理、页面布局等代码都写在一个 Fragment 中。在项目前期需求比较简单的时候,这样确实能快速开发页面完成需求,但在后面维护的过程中则带来了不便。后来有重构这些页面的机会,在此记录一下实际遇到的问题,以及自己的思考过程。
在我的项目中,页面通常是一个数据列表,通过网络加载数据,然后在页面上显示多个种类的卡片;页面的业务可能需要根据需要对返回数据进行预处理,或者为不同块的数据卡片加上头、尾;同时需要响应用户交互,实时更新数据并且将更新后的数据同步给服务器。
在安卓项目中经常有需要自定义 View
控件的场景。最近发现了两种声明构造方法的风格:
1 | class View1 extends View { |
在使用 Powermock 进行安卓的单元测试的编写时,出现了一些已经被调用了初始化的业务代码在执行测试时没有被初始化的情况,在此记录一下解决问题的过程。
首先建立一个类 InitData
,代表需要被初始化的业务单例代码: