美文网首页
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

    初次接触Litho,了解到包含的主要技术有:1、声明式组件开发2、布局的扁平化3、异步ui4、精细的组件复用机制不...

  • Litho 学习记录(1)

    根据官方文档 gradle导入(准备工作) PS:Android Support需要更新到25.3.1testCo...

  • Litho学习--Litho 简介

    背景介绍 Litho 是 FaceBook 2017年上半年开源的声明式UI渲染框架。 为什么 Facebook ...

  • 手把手教你Android Litho UI框架---(一)入门篇

    1.什么是Litho? Litho是Facebook推出的一套高效构建Android UI 的声明式框架,主要 目...

  • Litho粗读

    Litho 是什么 Litho官网Litho是Facebook推出的一套高效构建Android UI的声明式框架,...

  • Litho 资料合集

    Litho 官方文档https://fblitho.com/Litho Githubhttps://github....

  • Litho学习之--列表的实现-1

    这篇文章主要讲解一个简单列表的实现,包括如何自定义列表中的每个条目, 利用 RecyclerCollectionC...

  • litho对flexShrink的理解和使用

    今天遇到一个问题,在使用litho来构建litho布局的时候,一行有三个元素,中间那个元素通过flex=1来把中间...

  • Litho学习--Hello World

    1. 在build.gradle 文件中添加Litho依赖 再加入Sections部分的依赖: 2. 初始化 So...

  • litho

    持续更新中。。。。 简单介绍 litho是一个用于在Android上构建高效用户界面的声明性框架,它允许你通过基于...

网友评论

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

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