在 MainActivity 加了一个 TextView ,后台开线程请求网络数据,将结果 append 到 TextView 里面(每条大概 20 个字符),每次添加使用 scrollBy 滚动到最下方,当行数达到 500 行左右 UI 出现卡顿,大概几十行显示一次,到 1000 行的时候 UI 已经卡死不动了,看 Log 的话后台线程的网络请求一直都没问题。
网络请求是单线程队列的,同一时间只有一个线程发起网络请求。
刚入 Android 不久,有没有什么好的解决方案?
贴一下关键代码:
TextView logArea = (TextView) findViewById(R.id.LogArea);
Editable logText = (Editable) logArea.getText();
在 UI 线程的 Handler 中,
logText.append(message.obj);
logArea.scrollBy(0, logArea.getLineHeight());
大概是这样。
1
allan1st 2015-10-15 20:24:20 +08:00 1
用 RecyclerView/ListView 咯。
|
2
a302800411 2015-10-15 20:37:11 +08:00 1
没有复用 textView 吗?你难道 1000 多行,就 new 了 1000 多个 textView?
|
3
allan1st 2015-10-15 21:07:41 +08:00 1
@a302800411 LZ 说『将结果 append 到 TextView 里面』,如果真是这样,估计还是 TextView 长文字的性能问题。
|
4
alexlee0728 2015-10-15 21:09:01 +08:00 1
还是用 ListView 、 GridView 然后复用应该就没问题了。
|
5
suikator 2015-10-15 21:24:59 +08:00 via Android 1
试试 webview
|
6
ylqhust 2015-10-15 21:34:23 +08:00 1
recycleview 试试
|
9
Chrics OP @a302800411 没这么蠢=。= 看追加。
|
11
allan1st 2015-10-15 22:24:26 +08:00 1
@Chrics
(Editable) logArea.getText() 不会报错? 你怎么把 CharSequence cast 成 Editable 的? 直接 logArea.append() 不就可以了,放在一个 ScrollView , 纯文本的话几千行都不会卡。 |
12
Chrics OP @allan1st 嗯,可能看的资料比较老,用了 Ediable 。 Editable 是没有报错的, Editable extends CharSequence ,这个在源码里可以找到。。
TextVIew 自己带了滚动条,就没用 scrollview ,感觉效率低是发生在 scrollBy 重新渲染的过程中。 |
13
allan1st 2015-10-16 00:10:33 +08:00 1
@Chrics SDK android-23 里面的 TextView 里面 cast 会出错,因为 getText() 不再是了 editable 了。 TextView 的确自带了滚动条,但是你怎么保证你每次 append 的行数正好是一行呢?屏幕大小又不固定,万一有些是两行你只向下滚动了一行。你可以尝试使用 ScrollView 然后用 ScrollView::fullScroll(View.FOCUS_DOWN)。感觉比较简单高效。
另外我测试了 1000 行,无论是用 View 的 scrollBy 还是 ScrollView 的 fullScroll 都没有性能问题。说不定是 TextView 在新 SDK 中优化了,你可以尝试升级。 |
14
Chrics OP @allan1st 版本比较低,是 API 19 , 刚刚 ScrollView 里面放 TextView 试了下还是不行,暂停网络线程之后也还是会卡顿,我去升级下 API 试试。
|
16
morethansean 2015-10-16 09:14:59 +08:00
@Chrics …… 1w 行……所以是为什么不像楼上说的用 RecyclerView/ListView 呢?
|
17
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 |
19
Chrics OP @morethansean 感觉一行行的文本,加起来一个 TextView 大概就够了吧,就没往别的方向考虑,直到出了问题..
|