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

Android UI 操作卡顿

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

    在 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 咯。
    SkyEcho
        2
    SkyEcho  
       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     Solana     786 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 21:37 PVG 05:37 LAX 13:37 JFK 16:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86