fragment的setUserVisibleHint方法详解之不懂使用容易出大问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34900897/article/details/82426506

一开始不知道这个方法,用到tablayout+ viewpager,viewpager里面包含的是fragment,有这样的需求就是,每次滑动需要刷新当前页面,百度一看,有两个方法可以实现,1.setUserVisibleHint 2.onHiddenChanged

如果使用的是上面这张viewpager+tablayout 这种方法,用setUserVisibleHint可以有效的实现刷新数据,而onHiddenChanged这个是需要add、show 、hide隐藏这种方法,切不会走生命周期,如果不对请指正,这里讲解的是setUserVisibleHint方法。

来看张fragment生命周期图;

可以先记下!!!

这里用上setUserVisibleHint这个方法,本以为只是一个简单方法,没想到用了之后出现了大问题,

 override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if(isVisibleToUser){
            
        }
    }

如果是true就直接加载数据,按理说是对的啊,自己可以亲自试验一下发现加载了很多数据,还有用可能是没有数据,这是为什么呢,因为setUserVisibleHint方法的生命周期先与oncreate,当setUserVisbleHint把数据加载完了之后,onCreate还没有加载完成,造成问题所在。继续往下走。

当fragment有3的时候,setUserVisibleHint里面的方法执行了什么。

log

执行了3个false1个true,当显示出第一个界面的时候,isVisibleToUser是true。

把onResume一起打印一下。

看下执行过程

先执行setUserVisibleHint --- oncreate1 --onresume1 - oncreate2 - onResume2- oncreate3 -onResume3应该是这样的,刚刚debug就忘了,,自己可以打印一下,

这里的fragment是一个,而不是三个分开的。

其实知道了这些执行的生命周期过程,自认而然就ok了,不管是懒加载还是....都是一个道理。

顺便附上代码

private var isFristResume = true
private var isFristVisble = true
override fun onResume() {
        super.onResume()
        if (isFristResume){
            isFristResume = false
            return
        }
        if (userVisibleHint){
            //加载数据
        }
 }
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if(isVisibleToUser){
            if (isFristVisble){
                isFristVisble = false
                //加载数据这里为什么要加载呢,是因为前面的log,三个false和一个true
//第一次初始化的时候会执行一个true,也就是第一个可见的界面,当滑动到第二的界面时候,isFristvisble并不是false还是true,不会执行else,不会加载数据,只有当第二次的时候才会加载。这里只会执行三次,,而是一直会执行else的数据
            }else {
               //加载数据
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_34900897/article/details/82426506