美文网首页
Litho学习笔记-1

Litho学习笔记-1

作者: fan_xing | 来源:发表于2019-02-19 14:55 被阅读0次

    初次接触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提供更精细的组件复用,把每种类型的条目打散为更小的复用单位,而且所有的公用一个缓存池的方式实现复用

    官方文档
    <<< 才疏学浅,所写如若有误,还请赐教

    相关文章

      网友评论

          本文标题:Litho学习笔记-1

          本文链接:https://www.haomeiwen.com/subject/ugoxyqtx.html