android 动画懒加载,Android懒加载vs预加载------Viewpager+Fragment

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

2eb190614870

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中做控制即可

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值