返回

ViewPager中Fragment如何实现懒加载

Android

Fragment 生命周期

在讨论ViewPager中Fragment的懒加载之前,我们先来了解一下Fragment的生命周期。Fragment的生命周期与Activity的生命周期非常相似,它也经历了从创建到销毁的一系列状态转换。

setUserVisiblity已被废弃

在Fragment中,setUserVisibleHint方法已被废弃,不建议使用。它在Android 10.0(API 29)中添加了@Deprecated注解。这是因为setUserVisibleHint方法存在一些问题,例如:

  • setUserVisibleHint方法的调用时机不确定。它可能会在Fragment第一次被创建时调用,也可能在Fragment可见性发生变化时调用。
  • setUserVisibleHint方法不能保证Fragment在被调用时一定会可见。例如,当Fragment被添加到ViewPager中,但ViewPager还没有切换到该Fragment时,setUserVisibleHint方法可能会被调用,但此时Fragment实际上是不可见的。
  • setUserVisibleHint方法不能保证Fragment在被调用时一定会不可见。例如,当Fragment从ViewPager中被移除,但ViewPager还没有切换到其他Fragment时,setUserVisibleHint方法可能会被调用,但此时Fragment实际上还是可见的。

推荐使用setMaxLifecycle处理Fragment在ViewPager中的懒加载

推荐使用setMaxLifecycle来处理Fragment在ViewPager中的懒加载。setMaxLifecycle方法可以设置Fragment的最大生命周期状态,当Fragment的实际生命周期状态小于最大生命周期状态时,Fragment就不会被销毁。

在ViewPager中使用setMaxLifecycle来实现Fragment的懒加载,可以按照以下步骤进行:

  1. 在Fragment的onCreateView方法中,设置Fragment的最大生命周期状态为Lifecycle.State.STARTED。
  2. 在Fragment的onHiddenChanged方法中,当Fragment被隐藏时,设置Fragment的最大生命周期状态为Lifecycle.State.STARTED。
  3. 在Fragment的setUserVisibleHint方法中,当Fragment可见时,设置Fragment的最大生命周期状态为Lifecycle.State.RESUMED。

这样,当Fragment第一次被加载时,它的最大生命周期状态为Lifecycle.State.STARTED,因此不会被销毁。当Fragment被隐藏时,它的最大生命周期状态为Lifecycle.State.STARTED,因此也不会被销毁。当Fragment可见时,它的最大生命周期状态为Lifecycle.State.RESUMED,因此会被创建或恢复。

使用setMaxLifecycle来实现Fragment的懒加载,可以避免setUserVisibleHint方法存在的问题,并且可以保证Fragment在被调用时一定可见或不可见。

总结

在ViewPager中,可以使用setMaxLifecycle来实现Fragment的懒加载。这种方法可以避免setUserVisibleHint方法存在的问题,并且可以保证Fragment在被调用时一定可见或不可见。