viewpager默认会显示第一个界面 如果当前界面前面有界面或者后面又界面时,会默认加载前后各一个界面
顺序 先添加当前view 删除之前的当前view 当滑动的时候 会从左只有 依次添加新的view 以及删除之前的当前view
最后当adapter适配器finishUpdate时,才开始fragment的生命周期 fragment的Oncreateview方法中尽量不要做耗时操作,比如网络加载,因为viewpager会缓存界面,当多个fragment同时请求时,会产生一些网络问题
FragmentPagerAdapter中,即使fragment不可见了,他的事他实例还是存在于内存中,当 fragment比较多的时候,会占用较大的内存.
FragmentStatePagerAdapter,当fragment不可见时,可能会将fragment的实例会销毁,所以内存占会小一些
Fragment里面有一个方法 setUserVisibleHint(boolean isVisibleToUser)方法,这个方法可以判断当前页面是否对用户可见。
还有一点,当ViewPager缓存了旁边的那个碎片之后,那个碎片执行onCreateView之后,他碎片的生命周期会失效。当他被缓存抛弃的时候这个碎片就会被销毁。直到他又一次被缓存或者当他可见的时候才会执行onCreateView方法
public abstract class FragmentFactory extends Fragment {
private boolean isViewInitFinished;
//当Fragment所在的Activity被启动完成后回调该方法
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitFinished = true;
}
// 当前页面是否可见
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isViewInitFinished){
getData();
}
}
public abstract void getData();
}
卡顿情况有以下几种:
人为在UI线程中做轻微耗时操作,导致UI线程卡顿;
布局Layout过于复杂,无法在16ms内完成渲染;
同一时间动画执行的次数过多,导致CPU或GPU负载过重;
View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU或GPU负载过重;
View频繁的触发measure、layout,导致measure、layout累计耗时过多及整个View频繁的重新渲染;
内存频繁触发GC过多(同一帧中频繁创建内存),导致暂时阻塞渲染操作;
冗余资源及逻辑等导致加载和执行缓慢;
懒加载的含义就是没有显示当前页面时,不加载此页面 不网络请求,做复杂操作