初次接触Litho,了解到包含的主要技术有:
1、声明式组件开发
2、布局的扁平化
3、异步ui
4、精细的组件复用机制
不得不佩服大厂的创新能力及技术实力。
声明式组件开发
组件分类
Layout spec: 用于组合其他组件,相当于viewgroup
Mount spec: 可直接渲染的组件
yoga
结合yoga实现css的flexible布局
组件声明
通过无状态的ComponentSpec类定义,在编译期动态代码生成Component用于实际使用
@LayoutSpec
public class ListItemSpec {
@OnCreateLayout
static Component onCreateLayout(
ComponentContext c, @Prop int color,
@Prop String title, @Prop String subtitle,
@Prop(optional = true, resType = ResType.DIMEN_OFFSET) int shadowRadiusRes) {
return Column.create(c)
.paddingDip(YogaEdge.ALL, 16f)
.backgroundColor(color)
.child(Text.create(c).text(title).textSizeSp(40f))
.child(Text.create(c).text(subtitle).textSizeSp(20f))
.build();
}
}
Prop用于定义属性及相关方法
组件代码的生成
通过java的annotation processor实现
具体分三步:
1.根据Component spec创建spec model
2.spec model的validate()校验
3.调用spec model的generate()生成compon
组件使用
通过LithoView.create应用
class LithoActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val context = ComponentContext(this)
val component = ListItem.create(context).build()
setContentView(LithoView.create(context, component))
}
}
异步ui
线程安全与不可变
ui组件的渲染分measure、layout、draw三个阶段。为了防止多线程下对状态的修改导致渲染的不统一,所以android系统严格要求在主线程完成view的渲染。
如果渲染过程过于复杂,就会导致掉帧或者卡顿的现象,对于这种情况,litho采用状态不可变(不可修改)的方式保证多线程安全,同时提供异步的measure、layout,甚至draw的方式来规避这种问题。
状态不可变的实现
1.组件包括外部可见但不可变的props和外部不可见但可变的state,
2.采用缓存池的方式,缓存不可变props的组件对象,为每次的渲染返回包含新的state的组件对象。
3.缓存池可以有效的避免对象的频繁创建及内存的分配
增量挂载
只在可视区域内挂载可视组件
image
布局扁平化
1.litho会在计算完layout之后,丢弃包裹组件的容器,减少ui的层级。
如图中的标题所在的容器
image
2.litho会自动挂载一个view或者drawable。因为litho提供的多数核心widget并不是最终挂载的drawable或者view,如Text/Image
3.将最终的组件(Text/Image)绘制到view/drawable
image
组件复用
android系统通过recycleview/listview实现大量数据滚动展示时ui的复用。在一般情况下可以满足性能需求。当列表条目类型超过一定复杂度时,因为复用的是整个条目,这种方式就会显得比较笨重,而且每种条目都会有相应的缓冲池,加大了内存的消耗。
litho提供更精细的组件复用,把每种类型的条目打散为更小的复用单位,而且所有的公用一个缓存池的方式实现复用
官方文档
<<< 才疏学浅,所写如若有误,还请赐教
网友评论