Android基础之Fragment常用技巧(懒加载)

1、简介

      该篇博客是以记录Android开发中Fragment的使用技巧。作为开发中的大头,这一块还是有必要好好了解一下的。包括其生命周期包括其重要特性等,主要研究了fragment的懒加载以及fragment生命周期的使用和调用过程。

 优雅的懒加载实现

       开发也有一段时间了,不能说一直忽略懒加载,但是由于之前一直没有很好的掌握,故而希望借这次机会真真正正的把懒加载做好,因为不然性能真的很差,真的很难忍受初始化的时候明明只是进入了Fragment A 而 Fragment B  C  D 确得到了加载。这样真的非常的不好,因为每一个Fragment主页可能都会有很多的资源和网络请求需要进行加载,可想而知是非常的缓慢的,而且很容易造成内存不够的问题。说了这么多,有吐槽自己的不足点,也阐明了懒加载的必要性,下面就有有必要整理下实际项目中的懒加载应该如何做。OK,阐述一下懒加载主要存在于类似于TabLayout+ViewPager这种包含有缓存中,普通的Fragment切换是不需要懒加载的。

2 、知识储备

相信对于Fragment的生命周期大家都有所了解吧,下面是图例。

 值得留意的是不同于Activity被操作系统管理,Fragment是依附于Activity的同样其也是托管于Activity的。注意这里能发现Activity的方法类似,是的,对于Fragement而言,其调用时机也是和活动相同步的。

案例1展示:活动-fragment-fragment切换生命周期

 如下方log所展示,详细的记录了生命周期的切换。

//启动活动并且显示add FragmentA
Activity      onCreate
FragmentA     onAttach
              onCreate
              onCreateView
              onStart
Activity      onStart
              onResume
FragmentA     onResume
//先隐藏FragmentA  然后再add FragmentB
FragmentB     onAttach
              onCreate
              onCreateView
              onStart
              onResume               
// 退出活动
FragmentA     onPause
FragmentB     onPause
Activity      onPause
FragmentA     onStop
FragmentB     onStop
Activity      onStop
FragmentA     onDestroyView
              onDestroy
              onDetach
FragmentB     onDestroyView
              onDestroy
              onDetach
Activity      onDestroy
          

  案例展示2:验证setUserVisibleHint的调用时机

// 活动中展示Fragment 
    private void showFragment() {
        // 开启事务 ------
        FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment,new FragmentA());
        // 进行提交 -------
        fragmentTransaction.commit();
    }
  

//  Fragment中打印Log日志
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.e(TAG, "onAttach: ");
    }



    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        Log.e(TAG, "setUserVisibleHint: "+ isVisibleToUser);
        super.setUserVisibleHint(isVisibleToUser);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.e(TAG, "onDetach: ");
    }

观察启动界面的日志:  

09-12 11:29:06.173 3577-3577/com.example.mydairytestproject E/FragmentA: onAttach: 
09-12 11:29:08.585 3577-3577/com.example.mydairytestproject E/FragmentA: onDetach: 

值得注意的是,当仅仅是启动或者关闭一个Fragment时,其实并不会调用setUserVisibleHint()方法的。  该方法调用的时机是在:不同fragment切换时才会调用

那我们接下来完成一个ViewPager+Fragment的案例(FragmentA + FragmentB),看看其生命周期调用的情况吧。

这次我们打印Fragment的生命周期方法调用吧,说明一下,我是这样操作的: 首先自然是打开Activity显示的是FragmentA,然后切换到FragmentB  之后再切换回 FragmentA.

16467-16467/com.example.mydairytestproject E/FragmentA: setUserVisibleHint: false
16467-16467/com.example.mydairytestproject E/FragmentB: setUserVisibleHint: false
16467-16467/com.example.mydairytestproject E/FragmentA: setUserVisibleHint: true
16467-16467/com.example.mydairytestproject E/FragmentA: onCreate: 
16467-16467/com.example.mydairytestproject E/FragmentB: onCreate: 
16467-16467/com.example.mydairytestproject E/FragmentA: onCreateView: 
16467-16467/com.example.mydairytestproject E/FragmentB: onCreateView: 

6467-16467/com.example.mydairytestproject E/FragmentA: setUserVisibleHint: false
16467-16467/com.example.mydairytestproject E/FragmentB: setUserVisibleHint: true

16467-16467/com.example.mydairytestproject E/FragmentB: setUserVisibleHint: false
6467-16467/com.example.mydairytestproject E/FragmentA: setUse
  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值