-
目录
-
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()中将三个标志位进行默认值初始化
-