RecyclerView你不知道的优化点

论坛 期权论坛     
选择匿名的用户   2021-5-30 00:19   320   0
<div class="rich_media_content" id="js_content">
<p style="min-height:1em;letter-spacing:.544px;"><span style="font-size:14px;">作者:<strong>mandypig</strong></span></p>
<p style="min-height:1em;letter-spacing:.544px;"><span style="font-size:14px;">链接:</span></p>
<p style="min-height:1em;letter-spacing:.544px;"><span style="font-size:14px;color:rgb(0,128,255);">https://www.jianshu.com/p/1d2213f303fc</span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><span style="font-size:14px;">今天要说的那个东西其实大家都非常熟悉,那就是RecyclerView,没错大家都会用,但不知道对于RecyclerView的一些优化有多少人专门去研究过,不知道是不是一些开发者还只是停留在只会调用setadapter,然后配合notifyDataSetChanged这种万金油的方式上,又或者说是使用了一些优秀的三方库但是确只是简单停留在调用上就完事。</span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><br></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><span style="font-size:14px;">其实RecyclerView做为android开发一个非常常用的控件,可以这么说,一般普通的ui页面都可以通过RecyclerView去实现,个人觉得RecyclerView可以完全去替换掉scrollview,这里说的普通的ui页面特指那些没有酷炫交互方式的页面。</span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><br></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><span style="font-size:14px;">深入理解RecyclerView优化方面的技术对于发挥RecyclerView的性能是非常有帮助的。</span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><br></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><span style="font-size:14px;">写这篇文章的缘由还是之前项目在使用同事封装的adapter库时,bugly上报崩溃,在解决问题的过程中有机会深入理解RecyclerView的部分源码,结合网上一些文章,自己总结出来的心得体会,有兴趣的可以去看看我原先的那篇文章bugly关于RecyclerView崩溃问题研究</span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><br></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><strong><span style="font-size:14px;">借用一句现在流行的网络用语就是,RecyclerView不止眼前的setadapter和notify,还有诗和远方</span></strong><span style="font-size:14px;">。闲话扯到这,接下来就来看一下RecyclerView优化方面的东西。</span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><br></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><span style="font-size:14px;">关于RecyclerView的优化,自己会将它们分为两大类,一类是RecyclerView自带的系统优化,另一类就是我们通过代码实现的手动优化,先来介绍下RecyclerView自带的系统优化。系统优化我们不能做太多的干预,但是通过理解RecyclerView的系统优化能够让我们更好的理解RecyclerView的工作机制。</span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><span style="font-size:14px;"><br></span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><strong><span style="font-size:14px;"><span style="font-size:18px;letter-spacing:.544px;text-align:center;">预取功能(Prefetch)</span></span></strong></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><br></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><span style="font-size:14px;">这个功能是rv在版本25之后自带的,也就是说只要你使用了25或者之后版本的rv,那么就自带该功能,并且默认就是处理开启的状态,通过LinearLayoutManager的setInitialItemPrefetchCount()我们可以手动控制该功能的开启关闭,但是一般情况下没必要也不推荐关闭该功能,预取功能的原理比较好理解,如图所示</span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><br></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><img alt="640?wx_fmt&#61;other" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-578c83c94887a3bccfb4ffe66b12a633"></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><br></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><span style="font-size:14px;">我们都知道android是通过每16ms刷新一次页面来保证ui的流畅程度,现在android系统中刷新ui会通过cpu产生数据,然后交给gpu渲染的形式来完成,从上图可以看出当cpu完成数据处理交给gpu后就一直处于空闲状态,需要等待下一帧才会进行数据处理.</span></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><br></p>
<p style="min-height:1em;letter-spacing:.544px;text-align:left;"><span style="font-size:14px;">而这空闲时间就被白白浪费了,如何才能压榨cpu的性能,让它一直处于忙碌状态,这就是rv的预取功能(Prefetch)要做的
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP