V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Chrics
V2EX  ›  Android

Android UI 操作卡顿

  •  
  •   Chrics · 2015-10-15 20:15:27 +08:00 · 11172 次点击
    这是一个创建于 3325 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    第 1 条附言  ·  2015-10-15 21:55:03 +08:00

    贴一下关键代码:

    TextView logArea = (TextView) findViewById(R.id.LogArea);
    Editable logText = (Editable) logArea.getText();
    

    在 UI 线程的 Handler 中,

    logText.append(message.obj);
    logArea.scrollBy(0, logArea.getLineHeight());
    

    大概是这样。

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

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

    TextVIew 自己带了滚动条,就没用 scrollview ,感觉效率低是发生在 scrollBy 重新渲染的过程中。
    allan1st
        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 中优化了,你可以尝试升级。
    Chrics
        14
    Chrics  
    OP
       2015-10-16 00:29:42 +08:00
    @allan1st 版本比较低,是 API 19 , 刚刚 ScrollView 里面放 TextView 试了下还是不行,暂停网络线程之后也还是会卡顿,我去升级下 API 试试。
    Chrics
        15
    Chrics  
    OP
       2015-10-16 00:43:48 +08:00
    @allan1st 方便的话帮我测试下 1W 行可以吗?
    morethansean
        16
    morethansean  
       2015-10-16 09:14:59 +08:00
    @Chrics …… 1w 行……所以是为什么不像楼上说的用 RecyclerView/ListView 呢?
    Bown
        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
    allan1st
        18
    allan1st  
       2015-10-16 17:06:41 +08:00
    @Chrics 肯定会有问题的,早换 RecyclerView 早解决,即使是图文混排什么的照样不耽误性能。
    Chrics
        19
    Chrics  
    OP
       2015-10-18 02:31:52 +08:00
    @morethansean 感觉一行行的文本,加起来一个 TextView 大概就够了吧,就没往别的方向考虑,直到出了问题..
    Chrics
        20
    Chrics  
    OP
       2015-10-18 02:32:06 +08:00
    @allan1st 好的,已经改过了。
    Chrics
        21
    Chrics  
    OP
       2015-10-18 02:32:55 +08:00
    @Bown Get, 刚入坑,多去看点=、=
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   996 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:52 · PVG 03:52 · LAX 11:52 · JFK 14:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.