Moosphan/Android-Daily-Interview

2019-10-31:谈一谈Fragment懒加载?

Opened this issue · 14 comments

2019-10-31:谈一谈Fragment懒加载?

setmaxlifecycle大概是这个方法吧

重写setUserVisibleHint()

setUserVisibleHint()正解,比onCreate()先一步执行。

kwcn commented

建议不使用ViewPage,或者使用ViewPage2取消预加载,就可以避免需要懒加载解决的问题了

azhon commented

需要结合生命周期函数和setUserVisibleHint()函数。
详情请见BaseLazyFragment
结合ViewPager的示例查看TODO-MVVM

重写setUserVisibleHint方法

重写setUserVisibleHint方法实现Fragment的懒加载

其实懒加载的目的是,得到初始化和掌控,就算没有setUserVisibleHint()可以做到

setUserVisibleHint()正解,比onCreate()先一步执行。

为什么我记得这个方法并不会调用?是需要自己去调用的。

setUserVisibleHint()正解,比onCreate()先一步执行。

为什么我记得这个方法并不会调用?是需要自己去调用的。

setUserVisibleHint是必须在Vp里面 onhiddenchange是show hiden方式的时候调用、

但是以上两种方式实际上都在慢慢被砍掉 特别是前者 在比较新的版本中已经被标记废弃了。

建议使用VP2 (好像Vp1的adapter的第二个Int参数也行)或者单一的show hidden配合setmaxlifecycle,可以控制fragment的生命周期。

建议百度搜索“setmaxlifecycle fragment懒加载”,进行详细了解

本来Fragment的 onResume()表示的是当前Fragment处于可见且可交互状态,但由于ViewPager的缓存机制,它已经失去了意义,也就是说我们只是打开了“福利”这个Fragment,但其实“休息视频”和“拓展资源”这两个Fragment的数据也都已经加载好了。

Fragment里setUserVisibleHint方法
在这里判断 是否可见 是否第一次加载

还有一种方法 在viewpager2 中设置 setMaxLifeCycler(START)
使得预加载后的fragment 最多生命周期走到start
就可以在onresume中去做网络请求

本来Fragment的 onResume()表示的是当前Fragment处于可见且可交互状态,但由于ViewPager的缓存机制,它已经失去了意义,也就是说我们只是打开了“福利”这个Fragment,但其实“休息视频”和“拓展资源”这两个Fragment的数据也都已经加载好了。

Fragment里setUserVisibleHint方法
在这里判断 是否可见 是否第一次加载

还有一种方法 在viewpager2 中设置 setMaxLifeCycler(START)
使得预加载后的fragment 最多生命周期走到start
就可以在onresume中去做网络请求

AndroidX下,FragmentPagerAdapter构造函数可传递behavior参数,原理上使用了setMaxLifeCycler,修复了以上onResume回调的问题