当前位置: 代码网 > it编程>网页制作>网页播放器 > 阿里面试官:说一下RecyclerView-性能优化(1)

阿里面试官:说一下RecyclerView-性能优化(1)

2024年08月06日 网页播放器 我要评论
这里的 Html.fromHtml(data) 方法可能就是比较耗时的,存在多个 TextView 的话耗时会更为严重,这样便会引发掉帧、卡顿,而如果把这一步与网络异步线程放在一起,站在用户角度,最多就是网络刷新时间稍长一点。分页拉取远端数据,对拉取下来的远端数据进行缓存,提升二次加载速度;对于新增或者删除数据通过 DiffUtil 来进行局部刷新数据,而不是一味地全局刷新数据。减少布局层级,可以考虑使用自定义 View 来减少层级,或者更合理地设置布局来减少层级,不推荐在 RecyclerView 中使用

这里的 html.fromhtml(data) 方法可能就是比较耗时的,存在多个 textview 的话耗时会更为严重,这样便会引发掉帧、卡顿,而如果把这一步与网络异步线程放在一起,站在用户角度,最多就是网络刷新时间稍长一点。

数据优化

分页拉取远端数据,对拉取下来的远端数据进行缓存,提升二次加载速度;对于新增或者删除数据通过 diffutil 来进行局部刷新数据,而不是一味地全局刷新数据。

布局优化

减少过渡绘制

减少布局层级,可以考虑使用自定义 view 来减少层级,或者更合理地设置布局来减少层级,不推荐在 recyclerview 中使用 constraintlayout,有很多开发者已经反映了使用它效果更差,相关链接有:is constraintlayout that slow?、constraintlayout 1.1.1 not work well in listview。

减少 xml 文件 inflate 时间

这里的 xml 文件不仅包括 layout 的 xml,还包括 drawable 的 xml,xml 文件 inflate 出 itemview 是通过耗时的 io 操作,尤其当 item 的复用几率很低的情况下,随着 type 的增多,这种 inflate 带来的损耗是相当大的,此时我们可以用代码去生成布局,即 new view() 的方式,只要搞清楚 xml 中每个节点的属性对应的 api 即可。

减少 view 对象的创建

一个稍微复杂的 item 会包含大量的 view,而大量的 view 的创建也会消耗大量时间,所以要尽可能简化 itemview;设计 itemtype 时,对多 viewtype 能够共用的部分尽量设计成自定义 view,减少 view 的构造和嵌套。

其他

其他并不代表不重要,而是我不能把他们进行分类哈,其中可能某些操作会对你的 recyclerview 有很大的优化。

  • 升级 recycleview 版本到 25.1.0 及以上使用 prefetch 功能,可参考 recyclerview 数据预取。
  • 如果 item 高度是固定的话,可以使用 recyclerview.sethasfixedsize(true); 来避免 requestlayout 浪费资源;
  • 设置 recyclerview.addonscrolllistener(listener); 来对滑动过程中停止加载的操作。
  • 如果不要求动画,可以通过 ((simpleitemanimator) rv.getitemanimator()).setsupportschangeanimations(false); 把默认动画关闭来提升效率。
  • 对 textview 使用 string.touppercase 来替代 android:textallcaps=“true”。
  • 对 textview 使用 staticlayout 或者 dynamiclayout 的自定义 view 来代替它。
  • 通过重写 recyclerview.onviewrecycled(holder) 来回收资源。
  • 通过 recycleview.setitemviewcachesize(size); 来加大 recyclerview 的缓存,用空间换时间来提高滚动的流畅性。
  • 如果多个 recycledview 的 adapter 是一样的,比如嵌套的 recyclerview 中存在一样的 adapter,可以通过设置 recyclerview.setrecycledviewpool(pool); 来共用一个 recycledviewpool。
  • 对 itemview 设置监听器,不要对每个 item 都调用 addxxlistener,应该大家公用一个 xxlistener,根据 id 来进行不同的操作,优化了对象的频繁创建带来的资源消耗。
  • 通过 getextralayoutspace 来增加 recyclerview 预留的额外空间(显示范围之外,应该额外缓存的空间),如下所示:

new linearlayoutmanager(this) {
@override protected int getextralayoutspace(recyclerview.state state) {
return size;
}
};

更多android架构学习及大厂面试面试真题解析等资源获取方式:加入合作android架构学习交流qqun(评论区),管理处免费领取

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

资源分享

  • 最新大厂面试专题

这个题库内容是比较多的,除了一些流行的热门技术面试题,如kotlin,数据库,java虚拟机面试题,数组,framework ,混合跨平台开发,等

  • 对应导图的android高级工程师进阶系统学习视频
    最近热门的,ndk,热修复,mvvm,源码等一系列系统学习视频都有!


《android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,即可获取!
源码》,即可获取!**

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com