• 面试:Fragment懒加载


    AndroidX的Fragment懒加载 - 简书

    fragment懒加载的前世与今生_mashanshui的博客-CSDN博客

    以前处理 Fragment 的懒加载,我们通常会在 Fragment 中处理 setUserVisibleHint (ViewPager)+ onHiddenChanged(FragmentTransaction) 这两个函数,而在 Androidx 模式下,我们可以使用 FragmentTransaction.setMaxLifecycle() 的方式来处理 Fragment 的懒加载

    AndroidX之前的Fragment懒加载

    在AndroidX之前,Fragment的使用有两种方式:

    • 使用ViewPager+Fragment模式
    • 通过FragmentTransaction控制Fragment的使用

    1.AndroidX之前ViewPager模式的懒加载

    分析:
    由于ViewPager的缓存机制offscreenPageLimit始终>=1,所以ViewPager会缓存布局屏幕外的Fragment>=1个,被缓存的屏幕外的Fragment也会像屏幕可见的Fragment一样执行生命周期到onResume,并且在用户滑动后缓存的Fragment由不可见到可见时并不会调用onResume。根据ViewPager调用Fragment的方法顺序:

    setUserVisibleHint->onAttach->onCreate->onCreateView->onViewCreated->onActivityCreated->onStart->onResume

    所以,在androidX之前,ViewPager模式的懒加载方式是:

    • 对于第一个可见的Fragment,在onResume方法中执行懒加载请求数据
    • 对于缓存的Fragment由不可见到可见时,通过setUserVisibleHint方法中执行懒加载请求数据

    2.AndroidX之前FragmentTransaction控制模式的懒加载

    对于一个FrameLayout绑定多个Fragment,并每次只显示一个,我们可以这样通过FragmentTransaction控制Fragment的行为

    FragmentTransaction模式下Fragment会全部执行生命周期至onResume,并且会调用onHiddenChanged表示Fragment隐藏是否发生改变,但是第一个可见的Fragment因为是可见的,所以并不会调用onHiddenChanged

    所以,anroidX之前FragmentTransaction模式下的懒加载:

    • 第一个可见Fragment通过onResume方法和isHidden变量进行判断进行懒加载。
    • 其它由不可见到可见的Fragment,因为已经执行了onResume方法,所以通过onHiddenChanged方法进行懒加载:

    3.AndroidX的Fragment懒加载

    通过上面的分析我们知道在AndroidX之前,不管Fragment是否可见,都执行了onResume方法,这就违背了生命周期中onResume的设计本意了。所以在安卓X中,在FragmentTransaction类中增加了一个方法setMaxLifecycle(@NonNull Fragment fragment,@NonNull Lifecycle.State state),我们可以通过这个方法的第二个参数设置Fragment最大能执行到哪个生命周期方法。

    • 对于不可见的Fragment,我们可以通过FragmentTransaction. setMaxLifecycle(fragment, Lifecycle.State.STARTED)设置Fragment最大执行到onStart()方法。

    • 对于可见的Fragment,通过FragmentTransaction. setMaxLifecycle(fragment, Lifecycle.State.RESUMED)设置Fragment最大执行到onResume()方法。


    Androidx 下 Fragment 懒加载的新实现 - 掘金

  • 相关阅读:
    Mathorcup数学建模竞赛第四届-【妈妈杯】C题:家庭暑假旅游套餐的设计(附lingo代码)
    本地事务与分布式事务
    Java并发编程(一)
    useEffect(fn, []) 不等于 componentDidMount()
    无代码开发平台全部应用设置入门教程
    C#学生选课及成绩查询系统
    【DW组队学习—动手学数据分析】第二章:第三节数据重构2
    想打印k8s资源YAML结果搞懂了Client-Side & Server-Side Apply
    在 React项目中应用TypeScript
    pytorch中transform.Compose()用法
  • 原文地址:https://blog.csdn.net/cpcpcp123/article/details/127958141