Android懒加载vs预加载------Viewpager+F

作者: 诡异的叶子 | 来源:发表于2018-06-25 11:40 被阅读96次

    由于在最近的几个项目中,都遇到ViewPager+多个Fragment的加载需求,但是其中很多地方都需要大量的网络请求和图片加载,在用lint监测的情况下,内存真的是窜窜往上跑。所以,考虑在整个Activity和Fragement中做懒加载。

    image

    既然提到懒加载,在设计概念中就不得不提到两个加载方式--------懒加载和预加载。这里对两个加载方式做一个简要的介绍。

    1.预加载

    1.1预加载的理解

    在加载时,预先将所有资源加载的方式

    1.2 预加载的使用场景

    需要追求运行效率的项目中,并且内存消耗率非常低的业务逻辑。用户可以体验非常极致的加载和刷新效果,使用预加载可以做到非常好的效果。

    2.懒加载

    2.1懒加载的理解

    懒加载也就是延迟加载,所有资源只有在使用的时候才会加载。

    2.2懒加载的使用场景

    在加载时候需要大量网络请求或者消耗大量内存的操作的时候。比如说各种商城商品界面。这些页面图片数量多而且大,少说百来K,多则上兆。要是页面载入就一次性加载完毕。不仅用户需要很长的等待时间,甚至会在某些情况下出现OOM的情况。

    3.懒加载VS预加载

    两种方式的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载。懒加载对服务器端和客户端内存有一定的缓解压力作用,预加载则会增加服务器和和客户端压力。但是两种方式都有各自实用的场景,根据不同的业务,做不同的选择。这里我们优先对懒加载使用最多的业务逻辑Viewpager+Fragment做研究

    4.Viewpager+Fragment之性能优化

    ViewPager+Fragment作为Android程序员常用的一个组合控件,在很多优秀的APP中我们可以常见到。但是很多开发者都会遇到内存消耗过高,及界面卡顿,甚至OOM的可能性。作为一个优秀的程序员,这是不能忍耐的。当然,楼主是遇到在车载系统的开发中(内存极小,处理器落后,GPU渲染效果极差,老大说成本原因)直接OOM.What fuck!!没办法,只能找办法解决了。

    与网上大部分的大神,如鸿神,郭霖的方式不同,楼主采用在Fragment这个层次做控制.
    首先,配置用于Viewpager专用的BaseFragment:

    public abstract class BaseTabFragment extends Fragment {
    
        private boolean hasInit = false; // 是否已经初始化
    
        public boolean isHasInit() {
    
            return hasInit;
    
    }
    
        public void setHasInit(boolean hasInit) {
    
            this.hasInit = hasInit;
    
    }
    
        /**
    
    * 刷新页面
    
    */
    
        public abstract void refreshPage();
    
    }
    
    

    其次,viewpager中的Fragment继承该类。在其中实现refreshPage()方法

    public class MyFragment extends BaseTabFragment {
    //other ....
      @Override
        public void refreshPage() {
            setHasInit(true);
           //TODO do something there
    //...
        }
    //...
    }
    

    最后,在Activity中再做控制,主要是对于hashInit属性的操作:

    
    
        @Override
        public void onPageScrollStateChanged(int state) {
    
        }
    
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            //第一个fragment需要预加载
            if (position == 0) {
                BaseTabFragment tabListFragment = fragmentList.get(position);
                if (!tabListFragment.isHasInit()) {
                    tabListFragment.refreshPage();
                    tabListFragment.setHasInit(true);
                }
            }
    
        }
    
        @Override
        public void onPageSelected(int position) {
            BaseTabFragment tabListFragment = fragmentList.get(position);
            //selected fragment没有加载过,进行加载
            if(!tabListFragment.isHasInit()){
                tabListFragment.refreshPage();
            }
           // 使自定义的tabView背景变色
            TabLayoutUtils.toggleTabColor(tabLayout, tabsTitle.length, position, this); 
    
        }
    

    5.原理总结

    楼主的懒加载方式在于,使用增加的判断是否加载的属性hasInit方法来判定是否加载。如果业务需要,更改为预加载,只需要在Activity中做控制即可

    相关文章

      网友评论

        本文标题:Android懒加载vs预加载------Viewpager+F

        本文链接:https://www.haomeiwen.com/subject/epaeyftx.html