前言
众所周知,ViewPager自带预加载两个页面。这种情况会导致应用启动缓慢和流量时间的浪费。因此出现了懒加载。以前的懒加载都是通过setUserVisibleHint来增加标记量来实现的。但是在androidX 1.0.0以后,setUserVisibleHint方法已经被淘汰了,取而代之的是FragmentTransaction#setMaxLifecycle(Fragment, Lifecycle.State)。
setMaxLifecycle 简介
我们可以通过FragmentTransaction来设置Fragment的最大生命周期。
Style
- DESTROYED 销毁状态
- INITIALIZING 初始状态
- CREATED 已创建状态
- STARTED 创建并启动,可见不可操作
- RESUMED 创建启动并可操作
首先,我把生命周期方法从onCreate->onCretateView->onStart->onResume->onPause->onStop-> onDestoryView->onDestory视为从小到大排序;
同样的,我们把生命周期状态CREATED->STARTED->RESUMED视为从小到大排序;
CREATED状态
CREATED即已创建状态,狭义的理解是生命周期方法走到onCreate,如果当前fragment状态已大于CREATED,则会使fragment生命周期方法走到onDestoryView,如果小于CREATED,则走到onCreate;所以CREATED有两种情况;
STARTED状态
同理,STARTED状态也有两种情况,如果当前fragment状态已大于STARTED,则会使fragment生命周期方法走到onPause,如果小于CREATED,则走到onStart;
RESUMED状态
RESUMED表示的状态比较特殊,只代表onResume状态,无论大到小还是小到大,最终都是停留到onResume状态;
FragmentPagerAdapter中懒加载
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId