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,如有什么问题 能够及时提出

android settext 速度,Android TextView setText卡顿问题相关推荐

  1. Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿

    原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...

  2. android 播放音乐卡顿,Android MediaPlayer+SeekBar播放音频出现卡顿边长可能问题

    开发过程中总是会碰到一些"什么鬼,原来这么简单"等等的问题,比如今天碰到 Android MediaPlayer+SeekBar播放音频出现卡顿可能问题? 代码段一: seekBa ...

  3. android动画帧率_Android帧率、卡顿详解及使用

    卡顿分析 FPS帧率统计评测应用流畅度并不准确 系统获取FPS的原理:手机屏幕显示的内容是通过Android系统的SurfaceFlinger类,把当前系统里所有进程需要显示的信息合成一帧,然后提交到 ...

  4. android音乐播放器 单曲循环,[Android] MediaPlayer单曲循环不卡顿

    [TOC] 0x00 需求 单曲循环播放歌曲,要求过度连贯,听不出来卡顿感觉. 0x01 解决思路 MediaPlayer 对于常见的音乐播放,我们第一时间想到的应该就是它,它有一个方法 MediaP ...

  5. Android应用性能优化: 应用卡顿、ANR

    包含以下几个方面 1. 卡顿原因分析 2. 开发阶段如何给出性能提示? 3. 测试阶段如何体现卡顿质量? 4. 线上如何监控? 一. 卡顿原因分析 1. 界面绘制 ui布局复杂(层级过多). 过度绘制 ...

  6. Android Scrollview嵌套RecyclerView导致滑动卡顿问题解决(屡试不爽)

    今天开发的一个项目首页,布局还是比较复杂的,各种滑动冲突,(Banner+横向RecyclerView+纵向RecyclerView(item又是横向的RecyclerView)),  最外面的框架用 ...

  7. android模拟点击导致页面卡顿,逍遥安卓模拟器卡顿如何解决?模拟器卡顿解决方法介绍...

    是一款非常好用的电脑手游模拟器,不过有很多小伙伴表示在玩手游的时候会出现卡顿的情况,下面通过这篇文章给大家讲讲解决方法. 1.CPU vt开启 英特尔的硬件辅助虚拟化技术(Virtualization ...

  8. linux下的office 速度慢,针对Libreoffice卡顿奇慢的怪病,这里有一味特效药

    问题发生的环境: Gnome 3.24 / 界面字体Istok / LibreOffice 5.3.4 / Manjaro 17.0.1 解决方法之1: 更换与LibreOffice不兼容的Gnome ...

  9. android settext里面的参数,Android: fragment 中有时textview.setText()不起效

    如题. 出现场景: 送礼物的界面一个gridview 显示不同礼物item,每送出去一个,对应要更新展示的金币余额. 在一个fragment里面调用控件的setText()的时候,偶尔不起作用或者明显 ...

最新文章

  1. 小甲鱼Python课程18课课后题
  2. 在C++程序中调用被C编译器编译后的函数为什么要加extern“C”?
  3. 循环报数java代码_循环报数 Java实现
  4. python教程吾爱破解_2020年最新python入门到精通教程
  5. 钉钉直播回放视频的下载方法( fd抓包配合m3u8 )
  6. 惠普HP LaserJet 1320n 打印机驱动
  7. ivms4200 远程桌面访问测试过程及问题汇总
  8. JS逆向day01-青果教务系统登录接口
  9. 企域数科沈扬:破解传统销售困境,数字化营销将重塑汽车产业新格局丨数据猿专访...
  10. Taobao api, Jingdong api, 1688api, Pinduoduo api, Douyin api commodity interface source code
  11. 如何将CAD图块转换成外部参照?
  12. 错排问题(排列组合习题)
  13. php 二维数组为空,php 判断数组是否为空的几种方法
  14. 数据库与身份认证:数据库的基本概念
  15. springboot启动源码分析3-环境配置
  16. FHE学习笔记 #1 部分抽象代数名词
  17. 优酷视频云技术解析-立哥技术
  18. 企业拥有PMO(项目管理办公室)的好处
  19. 吐血总结:解决 Reboot and select proper boot device or ......以及其它蓝屏黑屏
  20. 风控中产品设计与贷前/中/后的四大模块都有哪些内容

热门文章

  1. 每日简报 6月6日简报新鲜事 每天一分钟 了解新鲜事
  2. 湖南省计算机专业中专的学校,长沙读中专计算机专业哪个学校好
  3. 日期moment与yy-mm-dd之间的转换:moment(‘00:00:00‘,‘HH:mm:ss‘)
  4. 用java实现小学自测软件下载_小学作业答案助手
  5. 新东方在线视频XZ方法
  6. 【面试算法】——字符串问题(一)
  7. SuperPoint
  8. 前端HTML5语音播报
  9. 新玺配资:重视疫情风险 A股无需过度恐慌
  10. js判断数据类型的方法(对象和数组的判断)