NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Facebook Litho:高性能安卓 UI 的构建框架

  • 2017-04-27
  • 本文字数:1049 字

    阅读完需:约 3 分钟

Facebook 开源了 Litho 。Litho 是一种创建安卓应用用户图形界面的框架,使用了类似于 React 的声明式风格,考虑了界面的滚动性能。

使用 Facebook Litho ,开发人员可以调用声明式 API 创建不可变的 UI 组件。由于组件是不可变的,因此可以另开一个用于准备渲染和布局的线程,然后将组件传递给 UI 线程,实现在屏幕上的实际渲染。Litho 使用了代码生成和针对渲染的组件优化,通过对组件分组降低了安卓 ViewGroups 的数量,使用更少视图层级生成更为平面化的界面。据 Facebook 宣称,这些做法降低了内存的使用,增加了界面的滚动速度。

Litho 使用 Yoga 布局组件,该过程可以同步完成,也可以异步完成。Yoga 是一个跨平台的布局引擎,它也是由 Facebook 开源发布的。考虑到组件是不可变的,而创建大量组件的代价很大,因此 Litho 允许一个组件被当前视图弃用后,可在其它视图中重用。

使用 Litho 定义一个“Hello, World!”文本组件的代码如下:

复制代码
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ComponentContext c = new ComponentContext(this);
final LithoView lithoView = LithoView.create(
this /* 上下文 */,
Text.create(c)
.text("Hello, World!")
.textSizeDip(50)
.build());
setContentView(lithoView);
}
}

LithoView 相当于安卓的 ViewGroup,实现 Litho 定义组件与安卓 View 间的关联。Text 是一个 Litho 提供的小部件,具有 text、textColor、textSize、textStyle 等一系列属性。

Litho API 相当庞大,其中包含多个软件包,具有超过 300 个 Java 类和接口。Litho 支持用户化布局、单元测试、事件处理、RTL(right-to-left)文本、可访问性等多种功能。

Litho 已用于多个 Facebook 的安卓应用,例如 Facebook、Facebook Lite、Messenger 和 Workplace 等。 Facebook 声称在界面滚动功能上,Litho 比安卓 RecyclerView 的性能提高了 35%。这是通过“将繁重工作转移到后台线程,并将渲染工作分布在多个帧中”实现的。此外:

Litho 将复杂视图分解为多个较小部分,例如文本、图像和视频等,然后增量地渲染各部分,并将需完成的工作分布到多个帧中。它还能在回收利用各个小部分,以无限可能的方式重组它们,这降低了在内存中需要创建并存储的视图个数。

该框架已发布在GitHub 上。如需了解更多细节,可参考指南文档

查看英文原文: Facebook Litho: An Android UI Framework Created for Performance

2017-04-27 19:004844
用户头像

发布了 227 篇内容, 共 71.4 次阅读, 收获喜欢 27 次。

关注

评论

发布
暂无评论
发现更多内容

Spring注入的对象到底是什么类型

JFound

spring

传统岗位新挑战:信息安全之路

nexpose

安全架构师 安全 安全管理

两边夹的应用三

孙苏勇

算法 两边夹

极客时间学习心得:用分类和聚焦全面夯实技术认知

Anfernee Hu

学习

永中云转换新升级 文档在线预览增添更多选择

DT极客

Android | Tangram动态页面之路(六)数据分离

哈利迪

android

实战!我用 Wireshark 让你 “看得见“ TCP

小林coding

Linux TCP 计算机网络

程序员的晚餐 | 5 月 21 日 四季豆炒腊肠

清远

美食

JVM源码分析之JVM启动流程

猿灯塔

KubeSphere权威指南(一)--------使用KubeSphere创建Percona Server,并对外暴露端口

赵欣

k8s percona server

[从零学习Spring Cloud]Nacos配置中心

玏佾

Spring Cloud nacos

Golang testing: “no test files”

北纬32°

Go 语言

云上数据库类产品的模式与发展趋势

韩超

数据库 redis 腾讯云 阿里云

深入浅出SpringMVC系列~

程序员的时光

spring springmvc

Python 如何随机打乱列表(List)排序

BigYoung

Python List random 随机

怎么用"设计思维"思考产品?

Yanel 说敏捷产品

产品 设计 产品设计 产品开发

数据产品经理实战-开篇

第519区

产品经理

高内聚与低耦合

落英亭郎

面向对象 高内聚 低耦合

c++代码整洁之道

泰伦卢

c c++ C#

k8s上运行我们的springboot服务之——热点数据

柠檬

redis

k8s上运行我们的springboot服务之——简单的架构思考

柠檬

k8s springboot

语雀性感,印象迟暮。

彭宏豪95

学习 工具 在线办公

乙己说:NUMA是个啥?

再见小飞侠

jdk G1 ZGC 内存

小岑的架构学习笔记-架构是什么?

程序员小岑

科学理论的反思

美多丽可

学习

分布式数据库

Leiy

我的事务为什么会失效

JFound

spring

小岑的架构学习笔记-架构设计的历史背景

程序员小岑

健康饮食和定期运动带给我们的一点启示

董一凡

生活质量

乙己说:LRU实现思路整理

再见小飞侠

缓存 LeetCode Go 语言

要弄清楚if/switch的本质区别,以及优化方式

张驰

Java

Facebook Litho:高性能安卓UI的构建框架_Java_Abel Avram_InfoQ精选文章