关于为什么setuservisiblehint会被废弃的原因思考:
这需要涉及到之前写过的一篇文章:性能优化:让ViewPager+Fragment模式更流畅。
之前总结了几种情景实现Fragment的性能优化问题。
现在提出setuservisiblehint()所不能解决的问题:
下面这段引用摘自第一篇引用的文章。
但是,它说的其实还不全。
老一套的第一套方案:
1.如果我们不去考虑懒加载的情况。还是可以通过setUserVisibleHint来解决很多简单的Fragment显示隐藏的情况。特别是执行了
mViewPager.setOffscreenPageLimit(fragments.size());
这段代码之后。不再会执行fragment的相关生命周期方法的情况。setUserVisibleHint这个方法很多时候依旧是有很多妙用的。
现在说说不能解决的情况。
AndroidX的setMaxLifecycle()方法如果要真正用来做懒加载,依旧会避免不了至少一个会执行onResume()方法。可以解决的方法是对不显示的Fragment使用骨架屏的方式。
而setMaxLifecycle则可以通过配置最大允许的生命周期来限制Viewpager下的Fragment的OnResume()的执行。
核心代码:
if (showPosition == index) {
setMaxLifecycle(fragment, Lifecycle.State.RESUMED)
} else {
hide(fragment)
setMaxLifecycle(fragment, Lifecycle.State.STARTED)
}
//获取其中所有的fragment,其他的fragment进行隐藏
val fragments = fragmentManager.fragments
for (fragment in fragments) {
if (fragment != showFragment) {
hide(fragment)
setMaxLifecycle(fragment, Lifecycle.State.STARTED)
}
}
两种方式的对比与总结
老一套的懒加载
优点:不用去控制 FragmentManager的 add+show+hide 方法,所有的懒加载都是在Fragment 内部控制,也就是控制 setUserVisibleHint + onHiddenChanged 这两个函数。
缺点:实际不可见的 Fragment,其 onResume 方法任然会被调用,这种反常规的逻辑,无法容忍。新一套的懒加载(Androidx下setMaxLifecycle)
优点:在非特殊的情况下(缺点1),只有实际的可见 Fragment,其 onResume 方法才会被调用,这样才符合方法设计的初衷。
缺点:
对于 Fragment 的嵌套,及时使用了 setMaxLifecycle 方法。同级不可见的Fragment, 仍然要调用 onResume 方法。
需要在原有的 add+show+hide 方法中,继续调用 setMaxLifecycle 方法来控制Fragment 的最大生命状态