由于在最近的几个项目中,都遇到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中做控制即可
网友评论