TextView 是经常使用控件之中的一个,最经常使用的方法是setText()  。

可是 我们在显示大量的文本的时候,使用setText还是会有一些性能的问题。

这篇文章 关于TextView的setText 的性能问题 和 如何优化。 先来介绍些基本知识

Android中的TextView是整个framework中最复杂的控件之中的一个,负责Android中显示文本的大部分工作,framwork中的很多控件也直接或者间接的继承于TextView。比如Button,EditText等。其内部实现也相当复杂。

TextView中很多操作都很繁重。比如setText操作,须要设置SpanWatcher,或者须要重现创建一个SpannableString,还须要依据情况又一次创建TextLayout,这些操作加起来之后令一次setText操作很耗时。

尤其是显示大量的文本
以及 emoji 表情的时候,会造成严重的性能问题。

之前做了一个类似朋友圈的功能。经过測试 有大量的emoji表情的时候 滑动的时候 会有 明显的卡顿感。

光一个item 就可能要载入30-50ms之长。

那么 一般对Android 小有研究的人都知道  渲染超过16ms 就会卡顿。

那么 为什么卡顿呢? 原因是丢帧造成的。

首先 16ms是怎么来的

16 = 1000 / 60;  这个公式  1000ms = 1秒钟 / 60帧。  也就是 在1秒钟内 显示60帧  人在操作的时候 才不会感觉卡顿。 那么假设超过了16ms   后面的帧 就来不及渲染。  那么就会把后面的丢掉 这是造成卡顿的原因。

TextView渲染基本原理

1.BoringLayout

主要负责显示单行文本,并提供了isBoring方法来推断是否满足单行文本的条件。


2.DynamicLayout
当文本为Spannable的时候,TextView就会使用它来负责文本的显示,在内部设置了SpanWatcher,当检測到span改变的时候。会进行reflow,又一次计算布局。

   3.StaticLayot
当文本为非单行文本,且非Spannable的时候,就会使用StaticLayout,内部并不会监听span的变化。因此效率上会比DynamicLayout高。仅仅需一次布局的创建就可以。但事实上内部也能显示SpannableString,仅仅是不能在span变化之后又一次进行布局而已。


(关于Spannable
,SpannableString和SpanWatcher这些就不在这里解释了,大家可自行搜索 )
 
 StaticLayot 可在 线程中使用。比較特殊, 为什么能在线程使用 详细没研究过....

上面描写叙述过setText存在的问题。 怎么解决? 答案就是使用 StaticLayout 预载入好。

因为StaticLayout可在

线程中使用。所以开线程预载入 大量要显示的文字 或 表情 可以提高性能。卡顿问题 得到明显改善。
渲染每一个item基本不超过 16ms。



 依据 以上内容写了个小小的demo。

项目内容主要是 对StaticLayot
的预渲染。

 项目已上传github,如有什么问题 能够及时提出

  更加具体的Textview 优化内容 http://ragnraok.github.io/textview-pre-render-research.html

Android TextView setText卡顿问题的更多相关文章

  1. android TextView SetText卡顿原因

    [android TextView SetText卡顿原因] 不要用wrap_content即可. 参考:http://blog.csdn.net/self_study/article/details ...

  2. android textview settext卡顿深层次原因

    最近在公司项目里面发现listview里面的textview在调用settext函数的时候非常耗时,当时都有点不敢相信,这是因为如果你把textview设置成wrap_content,则每次调用set ...

  3. Android 界面滑动卡顿分析与解决方案(入门)

    Android 界面滑动卡顿分析与解决方案(入门) 导致Android界面滑动卡顿主要有两个原因: 1.UI线程(main)有耗时操作 2.视图渲染时间过长,导致卡顿 目前只讲第1点,第二点相对比较复 ...

  4. Android中app卡顿原因分析示例

    在知乎回答了一个“为什么微博的app在iPhone比Android上流畅”的问题.后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里.有编程问题可以在这里交流.知乎链接. =========== ...

  5. 【Android端ANR卡顿检测】BlockCanary检测

    一.什么是BlockCanary? 检测主线程卡顿的一个开源工具,基本展现模式等都和LeakCanary很像 二.BlockCanary的工作原理是什么? 工作原理所涉及到的底层的内容一定要理解清楚 ...

  6. Android App解决卡顿慢之内存抖动及内存泄漏(发现和定位)

    内存抖动是指在短时间内有大量的对象被创建或者被回收的现象,内存抖动出现原因主要是频繁(很重要)在循环里创建对象(导致大量对象在短时间内被创建,由于新对象是要占用内存空间的而且是频繁,如果一次或者两次在 ...

  7. android中app卡顿优化问题

     所谓app卡顿原因就是在运行时出现了丢帧,还可能是UI线程被阻塞.首先来一下丢帧现象,android每16ms会对界面进行一次渲染,如果app的绘制.计算等超过了16ms那么只能等下一个16ms才能 ...

  8. Android性能优化----卡顿优化

    前言 无论是启动,内存,布局等等这些优化,最终的目的就是为了应用不卡顿.应用的体验性好坏,最直观的表现就是应用的流畅程度,用户不知道什么启动优化,内存不足,等等,应用卡顿,那么这个应用就不行,被卸载的 ...

  9. android中fragment卡顿的原因

    首页的ViewPager有十几个Fragment,在快速切换的时候,容易产生卡顿现象. 二.分析当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快 ...

随机推荐

  1. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---47

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  2. PHP json_encode 转换成空对象和空数组

    对于以下对象 $foo = array( "bar1" => array(), "bar2" => array() ); 我想转换成 { " ...

  3. win10下安装redis

    Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...

  4. 手游LTV(用户终生价值)计算公式

    在承接APP推广项目中,手游价值变现最直接,核心是获取更多的充值,其中LTV(Lifetime-Value生命周期价值)是一个重要参考指标,可以理解为玩家在其生命周期内对游戏的平均贡献值,为什么要计算 ...

  5. Linux 安装 Java 运行环境

    方式一 # 简单粗暴流# 我使用的是 ubuntu server 18.04 LTS 版本的系统 不同的系统的命令可能存在差异# 在命令行使用java 回车 发现没有Java的话 下面会提示 安装的方 ...

  6. 模型搭建练习2_实现nn模块、optim、two_layer、dynamic_net

    用variable实现nn.module import torch from torch.autograd import Variable N, D_in, H, D_out = 64, 1000, ...

  7. Oracle rac配置Weblogic数据源(实例名及URL的选择)

    这几天,应用程序后台一直报无法取得连数据库接池.但之前从来没有这个问题,迁移到Weblogic后才发生. 之后据了解,我们服务器上的Oracle 10G 是 RAC 的,即有两个节点. 两个节点 IP ...

  8. Windows API 教程(七) hook 钩子监听

    茵蒂克丝 如何创建一个窗口 手动创建窗口的流程 实际代码 安装钩子 (Install hook) 钩子简介 SetWindowsHookEx 函数 设置监听[键盘]消息 设置监听[鼠标]消息 如何创建 ...

  9. linux中grep注意

    grep -l 只输出文件名: -h 只输出匹配的行 不输出文件名: -c 之处匹配内容的行数: -n 将结果输出的同时,也输出改行的行号: -c 统计查到的总行数: -i 忽略大小写: grep ' ...

  10. DFRobot万物互联大赛第一轮

    前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. DF搞的这个比赛还挺有趣:micro:bit × OBLOQ DF创客社区玩转物联网挑战赛,一边在写文章一边在爱奇艺上看着印度电影 ...