关于Viewpager无限轮播(中级)
极限性能优化(高级)
小智
版权所有,不得转载
在做无限轮播的时候,这边的设计是使用自定义View来做轮播
用自定义View的原因是为了跟Fragment分开来,各分其职。
框架是--Fragment
-- ViewPager
--自定义View
--ViewPager轮播图
这里面 第二级Viewpager里面集成了5个自定义View,也就是说里面有5个ViewPager轮播图而且View没有onstrat,onstop方法去控制他,放着不管必定会损耗性能。那么控制他并处理性能的时候出现了很多难题,并将其解决。
难题1:切换View如何将上一个View,ViewPager停止轮播。
我给在Fragment下的ViewPager设置监听器代码如下:
new OnPageChangeListener() {
@Override
public void onPageSelected(int positon) {
System.out.println("onPageSelected--" + positon);
views.get(positon).startLooper();
currentPager = positon;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
System.out.println("onPageScrollStateChanged--" + arg0);
if (arg0 == 0) {
views.get(currentPager).startLooper();
} else if (arg0 == 2) {
views.get(currentPager).stopLooper();
} else {
views.get(currentPager).stopLooper();
}
}
}
用一个全局变量currentPager 在onPageSelected中拿到当前的position,并且开启轮播,然后在onPageScrollStateChanged中切换ViewPagerView的时候以及切换结束停止上一个view轮播图的轮播else if (arg0 == 2) {views.get(currentPager).stopLooper();} else {views.get(currentPager).stopLooper();
为了保障改变停止没有做任何事情的时候轮播图依旧轮播 我再给他加一条if (arg0 == 0) {views.get(currentPager).startLooper();}
Ok问题来了这窜代码如果感到费解,可以打印输出一下ViewPager监听器里面这三个方法的执行顺序,这样你就能理解为什么做这么一个优化。第一步优化完成。
问题2:优化到了一个段落,但是还有一个问题,一开始进入页面的时候第一个显示的View 并没有进行轮播,我们来分析一下这个问题,更深入的了解ViewPagerListenner之后,我们会发现一个问题,一开始的时候他并不会调用里面的方法,只有当我们滑动Fragment内的ViewPager的时候才会进行调用。那么我们需要控制他打开页面就能进行滑动轮播,只能从轮播图创建的地方入手了,ViewPager轮播图中的Adapter控制他的轮播。如下代码:
if (position == 0&& Fragment .currentPager ==0) {
((MainActivity)context).getFirstHomeCommenView();}
将currentPager设置成静态全局变量,创建的时候position为0开始轮播,而Fragment.currentPager这一层判断也是必要的,这是为了避免滑动到第二个View的时候,第一个View其实也会被创建出来降低了应用的性能。如果感到费解,可以了解一下ViewPager的工作原理。
在这里定义了getFiestHomeCommenView代码如下
MainActivity
public void getFirstHomeCommenView() {
mTabFragment.getFirstHomeCommenView();
}
mTabFragment代码
public void getFirstHomeCommenView() {
mHomeFragment.getFirstHomeCommenView();
}
mHomeFragment代码
public void getFirstHomeCommenView() {
views.get(0).startLooper();
}
这些代码应该都能懂的,如果费解,可以先了解一下Fragment之间的互相调用以及性息传递,第二步优化已经完成了。
问题:这样做其实还隐藏着这么一个潜在问题:当我切换Fragment的时候,或者在这个Fragemtn中打开一个Activity事实上轮播图还在轮播。这个就比较简单一点,我通过Fragment的生命周期onstart方法 跟onshop方法来控制他代码
@Override
public void onStop() {
System.out.println("HomeFragment---onStop");
views.get(currentPager).stopLooper();
super.onStop();
}
@Override
public void onResume() {
System.out.println("----------------requestWeb----------------");
mModel.requestWeb();
super.onResume();
}
现在就搞定了。
最后发现第三步优化已经解决了第二步优化的问题,所以将轮播图Adapter的优化代码删除,以上展示出来只是为了当成一种解决方法案例。到这里就实现了无限轮播图极限性能优化。
大神们有什么问题可以一起讨论,不足之处希望指出。
总结一下:应该一开始就应该做第三步优化。再做第一步优化就ok了。