一 卡顿问题
1.1 ListView的ItemView中使用了getViewTreeObserver().addOnPreDrawListener
在实际生产中发现列表快速滑动的掉帧非常厉害,但是无论通过FPS的检测以及method profile的测量此时的主线程都不应该卡顿。后面通过分析发现该列表页面的itemView中有如下一种代码:
viewHolder.textView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
viewHolder.textView.getViewTreeObserver().removeOnPreDrawListener(this);
。。。。。。。。。。
return false;
}
});
当ListView的某个item满足一定条件时就会进入上述这种代码,他会监听ViewTreeObserver的“OnPreDrawListener”,同时可能会返回false。
注意当这个函数返回false的时候,整个页面会skip掉本次的draw动作,注意是整个activity对应的DecoreView都不会在这次绘制时钟周期中绘制。因此当页面快速滑动的过程中,某些时机这个方法返回false页面不绘制,自然让人感觉到掉帧的出现
1.2 ListView中嵌套RecyclerView
在项目有这样的实现ListView中某个item是一个垂直展示的RecyclerView,RecyclerView的高度是WrapContent的,这样实现的话展示上看上去是没有问题的。但是在滑动的过程中我们会发现当滑动到RecyclerView区域时,页面变的很难滑动,滑起来很费力。经过分析这个也不是FPS低造成的,是由于这块区域的RecyclerView的事件处理和ListView时间产生了冲突,造成用户的滑动手势不灵敏。
解决的方案是禁用RecyclerView的