Android基础常用组件——Fragment的创建,生命周期,与Activity通信,结合ViewPager使用的预加载和懒加载
一、创建
Fragment的子类,在Android P上面都被禁用,并被其他的替代
- 静态创建,在xml文件中添加fragment
- 动态创建,在java中使用FragmentTransaction动态添加
二、生命周期
三、与Activity或者Fragment通信
- FragmentManager.findFragmentById(),这种方法适用静态添加有id的Fragment,动态添加的那就无法查找,
- interface,接口回调,
- LocalBroadcastManager,广播是最简单灵活,
- Fragment直接调用Activity中public方法,((MainActivity) getActivity()).showProByName(name);
四、ViewPager的预加载和Fragment的懒加载
ViewPager的预加载机制:ViewPager会默认把当前页面的左右相邻界面进行初始化,这样的好处是左右滑动更加流畅,默认值为1,源码public void setOffscreenPageLimit(int limit) 方法可以看出,这个默认值无法更改(有网友使用低版本的V4包的ViewPager源码修改),本文默认不能更改,假装没看见;
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "
+ DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
mOffscreenPageLimit = limit;
populate();
}
}
Fragment的懒加载的产生就是为了优化ViewPager的预加载问题,
ViewPager结合Fragment的使用,因为预加载机制,会把当前Fragment的相邻两个Fragment创建好,就是这三个Fragment都执行完onAttach -->OnResume生命周期函数,这个时候如果存在加载大量数据或者图片耗内存的操作,就是要考虑懒加载,也就是Fragment显示的时候才会加载数据等操作,
这就用到了Fragment里面的public void setUserVisibleHint(boolean isVisibleToUser) 方法,
如果你的网络请求并不需要涉及UI更新,那么就可以直接在setUserVisibleHint(boolean isVisibleToUser) 里操作,
但是setUserVisibleHint(boolean isVisibleToUser) 方法是比onCreateView更早调用的,但是我们一般在加载数据时,都会在数据加载完成时进行UI更新,所以这就有了一个问题,假如拉取数据是秒回,但是我们还没有进行UI绑定,或者是Adapter初始化等,那么我们就无法更新UI了,所以Fragment给我们提供了另一个方法getUserVisibleHint(),它就是用来判断当前Fragment是否可见,所以我们就可以在一系列变量初始化完成后再判断是否可见,若可见再进行数据拉取:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()){//此处不能用isVisibleToUser进行判断,因为setUserVisibleHint会执行多次,而getUserVisibleHint才是判断真正是否可见的
//dosomething
}
}