随着开发功能越来越复杂,我们使用的控件也越来越多。今天给大家带来一个找了好久解决掉的坑。
目前我们的APP首页使用了联动控件,CoordinatorLayout + AppBarLayout + RecyclerView。这个组合相信用过的都知道,坑其实挺多的,有造成屏幕抖动的,有造成部分白屏的,还有就是我解决的这个,快速滚动到底部,延迟很久才会回调RecyclerView的onScrollStateChanged。可能还有别的坑,目前就这几个。
先说一下原因吧,具体不知道是design的哪个版本升级,里面引入了惯性下滑的概念,滑动的速度越快,下滑的时间越长,就会让我们的界面实际上已经滑动到最底部了,但是还是卡在了下滑的过程之中,等惯性下滑的触发结束以后,才会触发RecyclerView的onScrollStateChanged。就会导致我们的RecyclerView明明已经滑动到最底部,需要去加载下一页数据,却一直卡着不动。
解决方法:其实明白了原因,网上关键字一搜解决方法还是很多的。主要是当碰到这个问题的时候,一直没有准确定位到原因。
分享一下我的调查和处理吧
1.我先是认为是应用的部分UI相关的处理比较复杂导致了应用的卡顿,然后将所有RecyclerView对于Ui相关的处理全部注释掉,发现没有任何改善。
2.分析是因为接口请求等太多太复杂,但是由于接口全部都是异步的,测试的时候心里预期80%不是这个引起的,注释完代码然后测试,结果正合我的预期。
3.由于RecyclerView中也实现了很多onScrollStateChanged 和onScroll 方法的重写,当时是怀疑自己写的onScroll 或者onScrollStateChanged方法内部处理导致了super的onScroll 和onScrollStateChanged 被拦截。同样注释代码测试,仍然不是。
4.最后看了一下所有代码都快注释完了,然后重新分析是不是布局导致的。然后看了这个联动控件,猜想可能是AppBarLayout 的滚动事件和RecyclerView的滚动事件相互冲突了。然后我把CoordinatorLayout注释了,运行,发现RecyclerV