Android UI 操作卡顿

2015-10-15 20:15:27 +08:00
 Chrics

在 MainActivity 加了一个 TextView ,后台开线程请求网络数据,将结果 append 到 TextView 里面(每条大概 20 个字符),每次添加使用 scrollBy 滚动到最下方,当行数达到 500 行左右 UI 出现卡顿,大概几十行显示一次,到 1000 行的时候 UI 已经卡死不动了,看 Log 的话后台线程的网络请求一直都没问题。

网络请求是单线程队列的,同一时间只有一个线程发起网络请求。

刚入 Android 不久,有没有什么好的解决方案?

11760 次点击
所在节点    Android
21 条回复
allan1st
2015-10-15 20:24:20 +08:00
用 RecyclerView/ListView 咯。
a302800411
2015-10-15 20:37:11 +08:00
没有复用 textView 吗?你难道 1000 多行,就 new 了 1000 多个 textView?
allan1st
2015-10-15 21:07:41 +08:00
@a302800411 LZ 说『将结果 append 到 TextView 里面』,如果真是这样,估计还是 TextView 长文字的性能问题。
alexlee0728
2015-10-15 21:09:01 +08:00
还是用 ListView 、 GridView 然后复用应该就没问题了。
suikator
2015-10-15 21:24:59 +08:00
试试 webview
ylqhust
2015-10-15 21:34:23 +08:00
recycleview 试试
Chrics
2015-10-15 21:55:37 +08:00
@suikator 不是要显示 WEB 页面,不需要用 webview 的。
Chrics
2015-10-15 21:55:53 +08:00
@lzx728
@ylqhust
@allan1st

嗯我试一下~
Chrics
2015-10-15 21:56:08 +08:00
@a302800411 没这么蠢=。= 看追加。
Chrics
2015-10-15 21:57:10 +08:00
@allan1st 嗯,粗略的算了下文字长度在 20K 了,或者是不是 scroll 太多引发的渲染问题?
allan1st
2015-10-15 22:24:26 +08:00
@Chrics
(Editable) logArea.getText() 不会报错?
你怎么把 CharSequence cast 成 Editable 的?
直接 logArea.append() 不就可以了,放在一个 ScrollView , 纯文本的话几千行都不会卡。
Chrics
2015-10-15 23:47:44 +08:00
@allan1st 嗯,可能看的资料比较老,用了 Ediable 。 Editable 是没有报错的, Editable extends CharSequence ,这个在源码里可以找到。。

TextVIew 自己带了滚动条,就没用 scrollview ,感觉效率低是发生在 scrollBy 重新渲染的过程中。
allan1st
2015-10-16 00:10:33 +08:00
@Chrics SDK android-23 里面的 TextView 里面 cast 会出错,因为 getText() 不再是了 editable 了。 TextView 的确自带了滚动条,但是你怎么保证你每次 append 的行数正好是一行呢?屏幕大小又不固定,万一有些是两行你只向下滚动了一行。你可以尝试使用 ScrollView 然后用 ScrollView::fullScroll(View.FOCUS_DOWN)。感觉比较简单高效。
另外我测试了 1000 行,无论是用 View 的 scrollBy 还是 ScrollView 的 fullScroll 都没有性能问题。说不定是 TextView 在新 SDK 中优化了,你可以尝试升级。
Chrics
2015-10-16 00:29:42 +08:00
@allan1st 版本比较低,是 API 19 , 刚刚 ScrollView 里面放 TextView 试了下还是不行,暂停网络线程之后也还是会卡顿,我去升级下 API 试试。
Chrics
2015-10-16 00:43:48 +08:00
@allan1st 方便的话帮我测试下 1W 行可以吗?
morethansean
2015-10-16 09:14:59 +08:00
@Chrics …… 1w 行……所以是为什么不像楼上说的用 RecyclerView/ListView 呢?
Bown
2015-10-16 10:41:42 +08:00
文本越多 TextView 在绘制的时候效率会越低的,绘制一次的时间超过了 16ms 就卡 UI 了
解决方案:
1. 参考这篇文章 http://ragnraok.github.io/textview-pre-render-research.html ,自定义文本 Layout 优化 TextView 的渲染
2. 文字无限多的时候,如楼上所说,文本分块然后 ListView/RecyclerView
allan1st
2015-10-16 17:06:41 +08:00
@Chrics 肯定会有问题的,早换 RecyclerView 早解决,即使是图文混排什么的照样不耽误性能。
Chrics
2015-10-18 02:31:52 +08:00
@morethansean 感觉一行行的文本,加起来一个 TextView 大概就够了吧,就没往别的方向考虑,直到出了问题..
Chrics
2015-10-18 02:32:06 +08:00
@allan1st 好的,已经改过了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/228357

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX