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

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

《Android懒加载vs预加载------Viewpager+Fragment》 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中做控制即可

    原文作者:诡异的叶子
    原文地址: https://www.jianshu.com/p/2eb190614870
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞