【AndroidDevSummit】Text 优化

忙完了双十一,开始看 Android Dev Summit 2018 的一些视频,后面会对这场交流会的几个感兴趣的 Topic 进行学习和分享。博客内容主要是对视频内容的总结和必要的扩展,其实看完视频就应该理解的差不多了。

这个 Topic 主要分析了 TextView 在渲染时(主要是 onMeasure() 阶段)的性能表现,并分析其耗时的原因,以及优化性能的一些方法。

性能分析

经过上面的测试,发现 Text 在渲染的时候非常消耗性能,那么就会有人问两个问题:

  • 为什么文字渲染流程这么费时呢?
  • 能不能将文字渲染过程放到后台线程中呢?

首先回答第一个问题,为什么文字渲染流程这么费时。要回答这个问题,就需要了解文字渲染的流程是什么样的。

Text 渲染流程

TextViewonMeasure() 过程中,90% 以上的代码都是 native 代码,

在后台线程计算 Text 渲染

既然 Text 渲染这么耗时,那么能不能将这个耗时流程放到后台线程中呢?如果放到后台线程中,会面临下面几个问题:

  1. 在 Android P 之前,Text 渲染的 native 代码需要一个非常大的同步代码块,而在 Android P 里面将这个同步代码块的粒度变小,使得多线程渲染效率得到了提高。
  2. 布局的时候需要 width 参数,但是在 onMeasure() 结束之前,是拿不到 width 参数的,这就变成了先有鸡还是先有蛋的问题了。

为了解决上面的问题,于是有了 PrecomputedText 类。

优化方案

  1. 关闭自动换行功能,性能提升大约 1 倍。
  2. 在 Android P 和 Android X 上面使用 PrecomputedText API,性能大约提升 17 倍。
  3. 如果使用了 Android Support Library 25+ 版本以上的 RecyclerView 控件,那么可以使用 Prefetch 类,并配合 PrecomputedText,以提升性能。
如果觉得文章对你有帮助,请我喝杯可乐吧