ViewPager+ Fragment结合的setUserVis

作者: 06fd4cf1f427 | 来源:发表于2019-06-10 18:02 被阅读48次

    最近的项目使用到了ViewPager + Fragment的模式,要求在每次Fragment获取显示的时候来刷新数据,该项目下ViewPager有5个子fragment,在onCreateView及fragment的setUserVisibleHint(bool isVisibleToUser)中的isVisibleToUser为true的时候刷新数据的时候出现数据多次刷新的情况,因此对ViewPage + Fragment的生命周期做了研究。

    项目布局最顶层5个button,主体是ViewPager+fragment, 可以通过点击button直接跳转到对应的fragment,也可以通过左右滑动来进行相邻跳转。

    为了研究多个fragment的生命周期,加入打印如下:

        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            Slog.i("onCreateView 3");
            View view = inflater.inflate(R.layout.my_police_events_fragment, container, false);
            return view;
        }
     
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            Slog.i("setUserVisibleHint 3 " + isVisibleToUser);
            super.setUserVisibleHint(isVisibleToUser);
        }
     
        @Override
        public void onDestroyView() {
            Slog.i("onDestroyView 3 ");
            super.onDestroyView();
        }
    
    1. 第一次进入该activity,fragment1被选中,打印如下:
    第一次进入
    setUserVisibleHint 1 false
    setUserVisibleHint 2 false
    setUserVisibleHint 1 true
    onCreateView 1
    onCreateView 2
    

    参数为true

    2. 从fragment1切换到fragment2,fragment2被选中,打印如下:
    从1--->2
    setUserVisibleHint 3 false
    setUserVisibleHint 1 false
    setUserVisibleHint 2 true
    onCreateView 3
    

    创建了fragment3,且fragment2中的setUserVisibleHint参数为true

    3.从fragment2切换到fragment3,fragment3被选中,打印如下:
    从2--->3
    setUserVisibleHint 4 false
    setUserVisibleHint 2 false
    setUserVisibleHint 3 true
    onDestroyView 1 
    onCreateView 4
    

    创建了fragment4,销毁了fragment1,且fragment3中的setUserVisibleHint参数为true

    4. 后面滑动的过程日志打印如下:
    从3--->2
    setUserVisibleHint 1 false
    setUserVisibleHint 3 false
    setUserVisibleHint 2 true
    onCreateView 1
    onDestroyView 4
     
    从2--->3
    setUserVisibleHint 4 false
    setUserVisibleHint 2 false
    setUserVisibleHint 3 true
    onDestroyView 1 
    onCreateView 4
     
    从3--->4
    setUserVisibleHint 5 false
    setUserVisibleHint 3 false
    setUserVisibleHint 4 true
    onDestroyView 2
    onCreateView 5
     
    从4--->5
    setUserVisibleHint 4 false
    setUserVisibleHint 5 true
    onDestroyView 3 
    

    猜测:通过以上日志,可以发现,不论fragment如何变化,首先被选中的fragment会调用参数为true的setUserVisibleHint方法,被选中的fragment与相邻的fragment的状态肯定是onCreate的状态(如果未create就调用onCreateView,如果已经是onCreate的状态不调用),相邻的fragment会调用参数为false的setUserVisibleHint方法,其他的fragment是处于onDestroy的状态。

    5. 为了验证我们的猜想,将不再采用相邻滑动的方式,采用button点击跳转的方式来检验fragment的生命周期。相关打印如下:
    从5--->2
    setUserVisibleHint 2 false
    setUserVisibleHint 1 false
    setUserVisibleHint 3 false
    setUserVisibleHint 5 false
    setUserVisibleHint 2 true
    onCreateView 2
    onCreateView 1
    onCreateView 3
    onDestroyView 4 
    onDestroyView 5 
     
    从2--->4
    setUserVisibleHint 4 false
    setUserVisibleHint 5 false
    setUserVisibleHint 2 false
    setUserVisibleHint 4 true
    onCreateView 4
    onCreateView 5
    onDestroyView 2 
    onDestroyView 1 
    

    总结:

    可以看到,不管fragment如何变化,都是按照上面的规则进行变动的,知道了fragment的生命周期,那么就可以选择在合适的时期对我们的数据进行处理了,避免出现数据未加载或者多次加载的情况了。

    Google预加载相邻的fragment是为了滑动更加流畅,给用户更佳的体验感。

    如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

    最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

    需要展开的架构学习笔记导图的加群免费获取 Android架构设计大群(185873940)
    image

    PS:群内有许多技术大牛,高手如云,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~

    相关文章

      网友评论

        本文标题:ViewPager+ Fragment结合的setUserVis

        本文链接:https://www.haomeiwen.com/subject/prctfctx.html