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信号机制调试段错误(Segment fault)【转】

    转自:http://blog.csdn.net/ab198604/article/details/6164517 版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际开发过程中,大家可能会遇到 ...

  2. linux多线程学习笔记五--线程安全【转】

    转自:http://blog.csdn.net/kkxgx/article/details/7506085 版权声明:本文为博主原创文章,未经博主允许不得转载. 一,线程安全基础 一个函数被称为线程安 ...

  3. Bluedroid之GKI

    1. 概述 GKI以库libbt-brcm_gki.a的形式提供给Bluedroid使用 该层是一个适配层,适配了OS相关的进程.内存相关的管理,还可以用于线程间传递消息 主要通过变量gki_cb(结 ...

  4. Windows开发

    1. 介绍 这里简单介绍了Windows应用程序开发的基础知识 2. 基础 Windows下的应用程序有控制台程序和Win32窗口程序,这里讲的是Win32窗口程序 Windows提供了相关静态库(L ...

  5. Codeforces Round #315 (Div. 2)【贪心/重排去掉大于n的元素和替换重复的元素】

    B. Inventory time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  6. Break Number --AtCoder

    题目描述 Takahashi loves numbers divisible by 2.You are given a positive integer N. Among the integers b ...

  7. Java基础教程---JDK的安装和环境变量的配置

    一.Java的安装和环境变量配置 1.Java的安装: 第一步,从Oracle官网下载安装包,当然也可以从其他安全可靠的地方下载(PS:根据不同电脑系统下载相应的安装包,注意电脑的位数.如x64,x3 ...

  8. Qt编程简介与基本知识

    1. 什么是Qt? Qt是一个基于C++的跨平台应用程序和UI开发框架.它包含一个类库,和用于跨平台开发及国际化的工具. 由挪威Trolltech公司开发,后被Nokia收购,目前被Digia公司收购 ...

  9. NVIDIA® Quadro® 四路缓冲 3D立体方案

    http://www.nvidia.cn/object/quadro_pro_graphics_boards_cn.html NVIDIA® Quadro® 专业显卡让地球学家以及时装设计师等许多专业 ...

  10. NV 3D投影方案 【转】

    http://tu.pcpop.com/all-677013.htm 1/8 NVIDIA 3D方案涉及图形处理器(GPU).信号发射器.快门式3D眼镜.3D播放软件以及经过NVIDIA认证的显示器. ...