欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android基础常用组件——Fragment的创建,生命周期,与Activity通信,结合ViewPager使用的预加载和懒加载

程序员文章站 2022-05-14 08:05:27
...

一、创建

Android基础常用组件——Fragment的创建,生命周期,与Activity通信,结合ViewPager使用的预加载和懒加载

Fragment的子类,在Android P上面都被禁用,并被其他的替代

 

  1. 静态创建,在xml文件中添加fragment
  2. 动态创建,在java中使用FragmentTransaction动态添加

二、生命周期

Android基础常用组件——Fragment的创建,生命周期,与Activity通信,结合ViewPager使用的预加载和懒加载                                Android基础常用组件——Fragment的创建,生命周期,与Activity通信,结合ViewPager使用的预加载和懒加载

 

三、与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源码修改),本文默认不能更改,假装没看见;

Android基础常用组件——Fragment的创建,生命周期,与Activity通信,结合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
	}
}