【Android知识复习总结】Fragment2

本文总结了Android中Fragment的切换方式,包括add、remove、replace、hide和show等,详细阐述了懒加载的必要性和实现方法,以及ViewPager的预加载机制。还探讨了ViewPager与Fragment结合使用可能导致的内存泄漏问题及其解决方案。
摘要由CSDN通过智能技术生成
  • 目录

    Fragment切换方式

    懒加载

    ViewPager的缓存机制 —— 预加载

    为什么要懒加载?

    什么是懒加载?

    实行懒加载必须满足的条件

    做法:


  • Fragment切换方式

    • FragmentTransaction对象,transaction的方法主要有以下几种
    • add()   向Activity中添加一个Fragment
      remove()     从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁
      replace()     使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体
      hide()     隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
      show()    显示之前隐藏的Fragment
      commit()     提交事务,在add/replace/hide/show以后都要commit其效果才会在屏幕上显示出来
    • add/show/hide:初始化时通过add加入Fragment,hide&show方式切换Fragment时将Fragment视图隐藏,所有的Fragment实例都会保存在内存,不会销毁与重建,不执行生命周期。点击fragment文字改变后,切换到其他fragment并返回时,文字保持点击后改变的文字,而不是初始化的文字。即fragment没有重建,保持之前的fragment。
    • replace(+addToBackStack):通过 replace 方法进行替换的时,Fragment 都是进行了销毁,重建的过程,相当于走了一整套的生命周期。
    • fragment1:onPause() -> onStop -> onDestroyView() -> onDestroy() -> onDetach()
    • fragment2:onAttach() -> onCreate() -> onCreateView() -> onActivityCreated() -> on Start() -> onResume()点击fragment文字改变后,切换到其他fragment并返回时,文字恢复为初始化的文字。即fragment重新创建并初始化。
    • TabLayout+ViewPager+Fragment:通常情况下开发应用最常见
      • 1、创建存储多个Fragment实例的列表
      • 2、创建PagerAdapter实例并关联到Viewpager中
      • 3、将ViewPager关联到Tablayout中
      • 4、根据需求改写Tablayout属性
    • ViewPager + Fragment结合使用会出现内存泄漏吗 & 如何解决?
      • 原因:一般ViewPager + Fragment结合使用出现内存泄漏的原因可能用某个集合存储了Fragment的实例,导致当用户滑动ViewPager的时候,某一个Fragment即将面临销毁的时候,由于这个集合持有的它的引用,因此不能被回收掉,如果Fragment里面有大量的数据占据内存,有可能会导致OOM。
      • 解决方法:尽量不要使用集合来存储Fragment实例对象,除非你有良好的二次封装。再就是要做好每一页Fragment的数据缓存问题。
  • 懒加载

    • ViewPager的缓存机制 —— 预加载

      • 234Fragment都已经执行完 onAttach() -> onResume() 这之间的生命周期函数了。
    • 为什么要懒加载?

      • Android的View绘制流程是最消耗CPU时间片的操作,尤其是在ViewPager+Fragment的情况下,会对所有的Fragment进行预加载。如果在View绘建的同时还进行多个Fragment的数据加载,那用户体验简直是爆炸(不仅浪费流量,而且还造成不必要的卡顿)因此,需要对Fragment们进行懒加载策略。
    • 什么是懒加载?

      • 被动加载,当Fragment页面可见时,才从网络加载数据并显示出来。
    • 实行懒加载必须满足的条件

      • View视图加载完毕,即onCreateView() 执行完成(因为setUserVisibleHint函数是游离在Fragment生命周期之外)
      • 当前Fragment可见,即setUserVisibleHint()的参数为true
      • 初次加载,即防止多次滑动重复加载
      • 做法:

        • 在Fragment全局变量中增加对应的三个标志参数并设置初始值
        • 在onCreateView中确保了View已经准备好时,将mPrepare置为true,在setUserVisibleHint中确保了当前可见时,mIsVisible置为true,第一次加载完毕后则将mIsFirstLoad置为false,避免重复加载。
        • lazyLoad()//这里进行三个条件的判断,如果有一个不满足,都将不进行加载//数据加载完毕,恢复标记,防止重复加载//这里进行网络请求和数据装载
        • 如果Fragment销毁的话,在onDestroyView()中将三个标志位进行默认值初始化

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值