Android面试10-Fragment

Android面试10-Fragment

    • Fragments生命周期
    • Fragment加载方式
      • 静态加载
      • 动态加载
    • Fragment懒加载
    • Fragment内存泄漏

Fragments生命周期

Android面试10-Fragment_第1张图片

Create:

onAttch–>onCreate–>onCreateView–>onActivityCreate

Started:

onStart

Resumed:

onResume

Paused:

onPaused

Stoped

onStop

Destory:

onDestoryView–>onDestory–>onDetach

onAttach(Activity): 当Fragment与Activity发生关联的时候调用,可以通过getArguments()获取参数,该方法只会调用一次
onCreate():Fragment被创建时调用,该方法只会调用一次
onCreateView(LayoutInflater, ViewGroup, Bundle) 创建fragment布局,必须返回一个View,该View就是Fragment需要显示的界面
onActivityCreated(Bundle) :加载布局结束后调用
onStart():当Fragment可见调用
onResume():当Fragment可见且可交互时调用
onPause():当Fragment不可交互但可见时调用
onStop():当Fragment不可见时调用
onDestroyView() Fragment的布局被移除时调用
onDestroy():销毁Fragment时调用
onDetach() :Fragment和Activity解除关联的时候调用

结合activity

Android面试10-Fragment_第2张图片

Fragment加载方式

静态加载

1.创建fragment.java

2.在activity布局里添加fragment。并且指定 name和id

Android面试10-Fragment_第3张图片

动态加载

1.创建fragment.java

2.通过代码去加载

Android面试10-Fragment_第4张图片

Fragment懒加载

一、要实现Fragment的懒加载需要满足三个条件:

1、布局是否初始化

2、视图是否可见

3、是否加载过数据

综上所述,只要满足这三个条件就可以执行加载操作。

二、如何实现

1、定义一个 isPrepared变量,在初始化视图的时候赋值为true;

2、定义一个isVisibleToUser变量,在页面可见状态赋值为true;

3、定义一个isDataInitiated变量,在页面加载数据时赋值为true;

使用Fragment自带的setUserVisibleHint()来判断当前fragment是否对用户可见,根据回调的isVisibleToUser参数来进行相关的逻辑判断。创建一个变量isVisible来拿到fragment是否可见的标志。

但是直接根据isVisible判断就加载数据,很有可能很多控件在OnCreateView()方法还未执行完成的情况下出现NullPointerException空指针的情况。所以我们需要在控件初始化完成并且用户可见的时候,再去进行数据的加载。

Fragment内存泄漏

1.采用FragmentStatePagerAdapter

FragmentStatePagerAdapter和FragmentPagerAdapter的主要区别是: FragmentStatePagerAdapter会及时回收fragment 而FragmentPagerAdapter会把fragment一直放在内存当中
那么在当前需求下肯定是要用FragmentStatePagerAdapter比较合适

2.FragmentStatePagerAdapter设置contentVp.setOffscreenPageLimit(1);
这个设置是防止viewpager缓存过多的fragment但是不用设置成0因为设置0默认最小值1

3.懒加载

4.需要特别注意的一点,把所有的Fragment new出来然后放在一个list里面在adapter的getItem(int position)的时候在用list.get(position)来返回fragment在这个需求下面是不行的,会导致fragment无法回收一直占用内存,j解决方案是:
在adapter的getItem(int position)的时候直接return NewsContentFragment.getInstance() 也就是直接new

你可能感兴趣的:(Android面试,android)