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

家人们, 50000 多个数据插入 Grid LayoutManager(三行九列)的 RecycleView 后光标滑动非常卡顿,有什么优化办法?

  •  
  •   Chelseawin · 2024-09-02 09:45:28 +08:00 · 7094 次点击
    这是一个创建于 369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    客户硬性要求,只能三行九列显示

    第 1 条附言  ·  2024-09-02 18:50:17 +08:00
    我发现问题了,是 onBindViewHolder 中开启 IO 线程,滑动线程就一直增加了,不是 wrap_content 的问题
    35 条回复    2024-09-04 08:54:28 +08:00
    RightHand
        1
    RightHand  
       2024-09-02 09:47:51 +08:00 via Android
    后台处理呗,处理好了再通知对应的 item 更新
    Chelseawin
        2
    Chelseawin  
    OP
       2024-09-02 09:52:52 +08:00
    @RightHand 我应该是表达错了,是插入后滑动很卡顿,左右上下都卡
    limiter
        3
    limiter  
       2024-09-02 09:55:56 +08:00
    数据里有图片?
    Chelseawin
        4
    Chelseawin  
    OP
       2024-09-02 10:00:12 +08:00
    @limiter 是的,网络请求,我用 Glide 库
    limiter
        5
    limiter  
       2024-09-02 10:04:50 +08:00
    @Chelseawin glide 不行,图片多了会导致滑动卡顿,两个办法,一个是改图片大小,使用缩略图,另一个是换库,用 Facebook 的 Fresco
    Chelseawin
        6
    Chelseawin  
    OP
       2024-09-02 10:07:28 +08:00
    @limiter #5 好的,我试一下 Fresco ,谢谢老哥
    ykrank
        7
    ykrank  
       2024-09-02 10:27:31 +08:00
    你是不是关了 VH 复用
    bjzhou1990
        8
    bjzhou1990  
       2024-09-02 10:31:17 +08:00
    要么图片太大,要么主线程有耗时操作
    mmCo
        9
    mmCo  
       2024-09-02 11:38:03 +08:00
    recyclerview 添加监听,滑动时停止 Glide 加载,静止后再重通知 Glide 开始加载,这样?
    tool2dx
        10
    tool2dx  
       2024-09-02 11:47:22 +08:00
    50000 也太多了,用虚拟列优化一下才行。
    iamqida
        11
    iamqida  
       2024-09-02 12:24:29 +08:00
    按需加载呀,为啥要在 ui 里加载那么多?
    whileFalse
        12
    whileFalse  
       2024-09-02 12:58:32 +08:00 via Android
    尝试先把图片优化成点对点
    Chelseawin
        13
    Chelseawin  
    OP
       2024-09-02 13:41:44 +08:00
    @mmCo 效果并不好
    Chelseawin
        14
    Chelseawin  
    OP
       2024-09-02 13:42:19 +08:00
    @iamqida 现在尝试 page3 分页加载试一下了
    realJamespond
        15
    realJamespond  
       2024-09-02 14:03:58 +08:00
    虚拟滚动呗
    qwwuyu
        16
    qwwuyu  
       2024-09-02 14:26:05 +08:00
    三行九列是什么意思 LinearLayoutManager 嵌套 GridLayoutManager 吗,那么里面的 RecyclerView 调用 setNestedScrollingEnabled(true),外层的不能用这个 API,并且里面的视图不能太高,复用里层的 RecyclerView 不能重复去设置 adapter,需要用更改数据+使用复用的 adaper.notifyDataSetChanged.
    1.在 onBindViewHolder 打印日志,确定不是一次性创建完了,只有视图上显示的被创建出来了,onBindViewHolder 中不要做大量计算耗时操作.
    2.图片在布局中写成固定宽高会好点,glide 卡 UI 一般只有滑动的时候大图加载出来会卡一下,如果不想卡的话,那就停止的时候才加载,滑动的时候取消.(可以先取消图片加载,看卡不卡,有一点点卡都是代码复用有问题)
    daiisdai
        17
    daiisdai  
       2024-09-02 14:47:17 +08:00
    几个点考虑

    1. 首先布局是不是没有写死宽高,渲染 View 时候计算宽高耗时,嵌套是不是比较严重,能不能缩减
    2. 有没有 BindViewHolder 中有没有计算任务
    3. 图片压缩,降低质量
    4. 图片加载时候做个延时,每个图片加载任务延时 50ms ,这样避免同时多个图片绘制
    itsCoderStudio
        18
    itsCoderStudio  
       2024-09-02 16:32:54 +08:00
    RecycleView 的卡顿跟数据多少没关系,它只会渲染屏幕中的数据。
    xmt328
        19
    xmt328  
       2024-09-02 16:57:14 +08:00
    @itsCoderStudio 如果是 wrap_content 的问题那我真的要笑死
    felix0liu
        20
    felix0liu  
       2024-09-02 17:13:25 +08:00
    先定位问题, 不加载图片看看是不是图片加载的原因, 还是布局本身的原因
    Chelseawin
        21
    Chelseawin  
    OP
       2024-09-02 17:18:29 +08:00
    @felix0liu 不加载图片还是卡顿
    Chelseawin
        22
    Chelseawin  
    OP
       2024-09-02 17:20:04 +08:00
    @qwwuyu 没有嵌套,就是 GridLayoutManager 。我取消图片还是会卡
    MozzieW
        23
    MozzieW  
       2024-09-02 17:45:11 +08:00
    RecyclerView 只渲染屏幕显示的数据,5000 行数据只增加内存和自己代码处理的复杂度(耗时),检测一下一下自己写的代码的运行耗时,加日志、使用第三方库、使用 Profile 功能,找到是哪个函数、代码耗时长,针对解决
    Chelseawin
        24
    Chelseawin  
    OP
       2024-09-02 17:56:12 +08:00
    @MozzieW 好的,感谢老哥
    wgl
        25
    wgl  
       2024-09-02 18:01:44 +08:00
    你看看你的 Item 布局有没有嵌套很多层布局,我之前就有个同事,嵌套了很多层,然后代码死活检查不出来哪里造成的,然后一看布局,套了好几层
    yukiww233
        26
    yukiww233  
       2024-09-02 18:26:57 +08:00
    盲猜一下, recyclerview 用了 wrap_content?
    RecyclerView 性能和 item 数无关
    zhaoweihao
        27
    zhaoweihao  
       2024-09-02 18:29:45 +08:00
    感觉像是用了 wrap_content ,这样会导致 recyclerview 的复用其实无效了
    yor1g
        28
    yor1g  
       2024-09-02 19:00:27 +08:00
    设备配置是什么? 打包出来还卡?
    Chelseawin
        29
    Chelseawin  
    OP
       2024-09-02 19:13:52 +08:00
    @yor1g 4+128 的 Android TV 盒子
    yor1g
        30
    yor1g  
       2024-09-02 19:30:56 +08:00
    @Chelseawin 打包出来性能还卡吗 不要调试 性能差的设备调试可能会很卡 尤其是有断点
    liuchenx
        31
    liuchenx  
       2024-09-02 19:37:01 +08:00
    你这必然是代码的问题,哪里处理不对导致 recyclerview 的缓存复用没有生效
    azhangbing
        32
    azhangbing  
       2024-09-02 23:49:26 +08:00
    跟数据量没关系 ,检查一下布局可能导致列表重绘的可能
    tiiime
        33
    tiiime  
       2024-09-03 09:52:18 +08:00
    auhah
        34
    auhah  
       2024-09-03 11:23:46 +08:00
    onBindViewHolder 里面开启了 IO 线程

    。。。。

    起码用个线程池啊哥,线程池用着麻烦协程走起来
    Chelseawin
        35
    Chelseawin  
    OP
       2024-09-04 08:54:28 +08:00
    @auhah 我错了,我错了。这项目就我一个人搞,没人带我
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2587 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:34 · PVG 19:34 · LAX 04:34 · JFK 07:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.