关于Viewpager无限轮播(中级)

关于Viewpager无限轮播(中级)
极限性能优化(高级)
小智
版权所有,不得转载
在做无限轮播的时候,这边的设计是使用自定义View来做轮播
用自定义View的原因是为了跟Fragment分开来,各分其职。
框架是--Fragment
                       -- ViewPager
                                    --自定义View
                                            --ViewPager轮播图
这里面 第二级Viewpager里面集成了5个自定义View,也就是说里面有5个ViewPager轮播图而且View没有onstrat,onstop方法去控制他,放着不管必定会损耗性能。那么控制他并处理性能的时候出现了很多难题,并将其解决。
    难题1:切换View如何将上一个View,ViewPager停止轮播。

    我给在Fragment下的ViewPager设置监听器代码如下:
   
   
  1. new OnPageChangeListener() {
  2. @Override
  3. public void onPageSelected(int positon) {
  4. System.out.println("onPageSelected--" + positon);
  5. views.get(positon).startLooper();
  6. currentPager = positon;
  7. }
  8. @Override
  9. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  10. }
  11. @Override
  12. public void onPageScrollStateChanged(int arg0) {
  13. System.out.println("onPageScrollStateChanged--" + arg0);
  14. if (arg0 == 0) {
  15. views.get(currentPager).startLooper();
  16. } else if (arg0 == 2) {
  17. views.get(currentPager).stopLooper();
  18. } else {
  19. views.get(currentPager).stopLooper();
  20. }
  21. }
  22. }
用一个全局变量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控制他的轮播。如下代码:
   
   
  1. if (position == 0&& Fragment .currentPager ==0) {((MainActivity)context).getFirstHomeCommenView();}
将currentPager设置成静态全局变量,创建的时候position为0开始轮播,而Fragment.currentPager这一层判断也是必要的,这是为了避免滑动到第二个View的时候,第一个View其实也会被创建出来降低了应用的性能。如果感到费解,可以了解一下ViewPager的工作原理。
在这里定义了getFiestHomeCommenView代码如下
MainActivity
    
    
  1. public void getFirstHomeCommenView() {
  2. mTabFragment.getFirstHomeCommenView();
  3. }

mTabFragment代码
    
    
  1. public void getFirstHomeCommenView() {
  2. mHomeFragment.getFirstHomeCommenView();
  3. }
mHomeFragment代码
    
    
  1. public void getFirstHomeCommenView() {
  2. views.get(0).startLooper();
  3. }
这些代码应该都能懂的,如果费解,可以先了解一下Fragment之间的互相调用以及性息传递,第二步优化已经完成了。

    问题:这样做其实还隐藏着这么一个潜在问题:当我切换Fragment的时候,或者在这个Fragemtn中打开一个Activity事实上轮播图还在轮播。这个就比较简单一点,我通过Fragment的生命周期onstart方法 跟onshop方法来控制他代码
    
    
  1. @Override
  2. public void onStop() {
  3. System.out.println("HomeFragment---onStop");
  4. views.get(currentPager).stopLooper();
  5. super.onStop();
  6. }
  7. @Override
  8. public void onResume() {
  9. System.out.println("----------------requestWeb----------------");
  10. mModel.requestWeb();
  11. super.onResume();
  12. }
现在就搞定了。
    最后发现第三步优化已经解决了第二步优化的问题,所以将轮播图Adapter的优化代码删除,以上展示出来只是为了当成一种解决方法案例。到这里就实现了无限轮播图极限性能优化。
大神们有什么问题可以一起讨论,不足之处希望指出。
总结一下:应该一开始就应该做第三步优化。再做第一步优化就ok了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值