Androidx 下 Fragment 懒加载的新实现,AnyChat音视频互动开发平台

本文介绍了在Androidx环境下Fragment懒加载的实现,包括ViewPager+Fragment模式下的新旧方案,以及处理复杂Fragment嵌套的情况。重点讲解了Androidx的setMaxLifecycle方法如何帮助实现更优雅的懒加载,避免不必要的生命周期调用。
摘要由CSDN通过智能技术生成

super.onHiddenChanged(hidden)

isVisibleToUser = !hidden

judgeLazyInit()

}

private fun judgeLazyInit() {

if (!isLoaded && !isHidden) {

lazyInit()

isLoaded = true

}

}

override fun onDestroyView() {

super.onDestroyView()

isLoaded = false

}

//懒加载方法

abstract fun lazyInit()

}

该懒加载的实现,是在 onResume 方法中操作,当然你可以在其他生命周期函数中控制。但是建议在该方法中执行懒加载。

ViewPager+Fragment 模式下的老方案

使用传统方式处理 ViewPager 中 Fragment 的懒加载,我们需要控制 setUserVisibleHint(boolean isVisibleToUser) 函数,该函数的声明如下所示:

public void setUserVisibleHint(boolean isVisibleToUser) {}

该函数与之前我们介绍的 onHiddenChanged() 作用非常相似,都是通过传入的参数值来判断当前 Fragment 是否对用户可见,只是 onHiddenChanged() 是在 add+show+hide 模式下使用,而 setUserVisibleHint 是在 ViewPager+Fragment 模式下使用。

在本节中,我们用 FragmentPagerAdapter + ViewPager 为例,向大家讲解如何实现 Fragment 的懒加载。

注意:在本例中没有调用 setOffscreenPageLimit 方法去设置 ViewPager 预缓存的 Fragment 个数。默认情况下 ViewPager 预缓存 Fragment 的个数为 1

初始化 ViewPager 查看内部 Fragment 生命周期函数调用情况:

2824145-eac42f17df339654.png

观察上图,我们能发现 ViePager 初始化时,默认会调用其内部 Fragment 的 setUserVisibleHint 方法,因为其预缓存 Fragment 个数为 1 的原因,所以只有 Fragment_1 与 Fragment_2 的生命周期函数被调用。

我们继续切换到 Fragment_2,查看各个Fragment的生命周期函数的调用变化。如下图所示:

2824145-af63642f00e813e2.png

观察上图,我们同样发现 Fragment 的 setUserVisibleHint 方法被调用了,并且 Fragment_3 的一系列生命周期函数被调用了。继续切换到 Fragment_3:

2824145-6f88bb3b5929d5bd.png

观察上图可以发现,Fragment_3 调用了 setUserVisibleHint 方法,继续又切换到 Fragment_1,查看调用函数的变化:

2824145-ea6d49cb4e320aee.png

因为之前在切换到 Fragment_3 时,Frafgment_1 已经走了 onDestoryView(图二,蓝色标记处) 方法,所以 Fragment_1 需要重新走一次生命周期。

那么结合本节的三幅图,我们能得出以下结论:

  • 使用 ViewPager,切换回上一个 Fragment 页面时(已经初始化完毕),不会回调任何生命周期方法以及onHiddenChanged(),只有 setUserVisibleHint(boolean isVisibleToUser) 会被回调。

  • setUserVisibleHint(boolean isVisibleToUser) 方法总是会优先于 Fragment 生命周期函数的调用。

所以如果我们想对 ViewPager 中的 Fragment 懒加载,我们需要这样处理:

abstract class LazyFragment : Fragment() {

/**

  • 是否执行懒加载

*/

private var isLoaded = false

/**

  • 当前Fragment是否对用户可见

*/

private var isVisibleToUser = false

/**

  • 当使用ViewPager+Fragment形式会调用该方法时,setUserVisibleHint会优先Fragment生命周期函数调用,

  • 所以这个时候就,会导致在setUserVisibleHint方法执行时就执行了懒加载,

  • 而不是在onResume方法实际调用的时候执行懒加载。所以需要这个变量

*/

private var isCallResume = false

override fun onResume() {

super.on

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值