说到ViewPager 的缓存页面 与 预加载 与 懒加载。哎,如同懂,可是又不完全懂。模模糊糊的感觉

ViewPager 缓存页面 与 预加载

缓存 与 预加载其实是两种东西,早年我总混为一谈。

缓存页面与预加载
缓存页面是为了预加载而服务的。先缓存,再预加载的时分就能直接加载了。

setOffscreenPageLimit(翻译 set屏幕外的page的limit)

装备ViewPager的时分,能够设置setOffscreenPageLimit参数来设置缓存、预加载的数量,可是我之前的了解一只是错的。
ViewPager预加载、懒加载

当set接口的作用OffscreenPage接口crc错误计数Limit(2)的时分

要点!!!缓存,缓存的是当时页面的左面2个和右边两个
所以算上自己,应该是有5个页面

ViewPager预加载、懒加载

要点!!!预加载加载的是跳转方向上的后边两个

比如从1跳转到3,那么预加载的是缓存视频4.5
比如从4跳转到2源码年代训练怎么样,那么预加载的是1(0没缓存视频兼并app下载有就不加载缓存

ViewPager预加载、懒加载

缓存之所以要缓存左右两头,便是为了预加载的时分能从左跳到右,预加载右,反过来能够加载左面。

预加载问题

mView缓存Pager.setOffscreenPageLimit(0);是没有用的,源码里最小是1。这就引源码之家发了一个问题,也便是ViewPager有必要预加载,想让他不加载都不行

而预加载的意思便是 当时页面为tab = 1,那么tab = 2的Fragmenjavascriptt的生命周期都会跑完,会在那调接口、初始化等等
当setOff源码年代训练怎么样screenPageLimit值设置的比较大(5),从1跳转到6的时分,先回缓存6左右两头各5个页面,然后6后边的5个页面会预加载(都会央求接口,初始化页面等等),非常耗费内存,而且这个内存根柢就收回不掉。形成OOM

ViewPager预加载、懒加载

ViewPager源码

populate

ViewPjava初学ager里关于适配Adapter 的嵌套函数代码全接口和抽象类的差异在populate()办法里。所以要点便是这个办法。

populate()里重要的办法有五缓存个:
st嵌套函数artUpdate预备适配(不重要)、
instantiateItem创立item数据、
destroyItem销毁item(源码买卖网站源码嵌套分类汇总的操作步骤重要)、
setPrimaryItem设置当时item闪现、
finishUpdate结束适配

这里说的是viewPager+f嵌套ragment。所以item=fragment,这些办法结束都在FragmentPagerAdapter.java里

ViewPager预加载、懒加载

  1. instan源码编程器tiateIte缓存视频m创立item数据的时分,会将fragm嵌套分类汇总的操作步骤ent设置成不行见(也便是缓存fragment不行见)。

ViewPager预加载、懒加载

  1. setPrimaryItem设置当时item闪现

ViewPager预加载、懒加载

  1. finishUpdate结束适配,在结java言语束适配的时分会调用Fjava难学吗ragment的生命周期

ViewPager预加载、懒加载

总结

1.在嵌套分类汇总setPrimaryItem(设置当时item闪现)的时分,会设置点击的Fragment为可见的,别的都为不行见的 fragment.setUserVisibleHi嵌套if函数nt();

2.在结束适配的时分会调用Fragment的生命周期

3.也便是说setUserVisibleHint()会在Fragment的生命周期之前调用,而他不属于Fragment的生命周期

懒加载

懒加载的意图便是避免ViewPager的预加载,导致Fragment在那央求接口初始化等。
或者说 — 在页面可见的时分只加载当时页面。当页面不行见的时分,间断全java初学部正在进行的加载。

结束BaseFragment

  1. setUserVisibleHint,当页面可见的时分加载数据,不行见时间断加载

ViewPager预加载、懒加载

  1. 因为setUserVisibleHint在Fragment生命周接口和抽象类的差异期之前调用的,所以在子Fragment–加载网络数据央求–时接口文档假如用到Fragment的任何东西都会闪退。所以源码网站得加个判别

isViewCreat接口和抽象类的差异ed是否onCreateView

ViewPager预加载、懒加载

在onCr缓存视频变成本地视频eateView里还嵌套调用得手动调用一下setUserVisibleHint这个办法

ViewPager预加载、懒加载

  1. 可是这接口自动化样仍是有bug,会重复好几次调用setUserVis源码买卖网站源码ibleHint,因为一瞬间预加载调用,一瞬间缓存文件在哪里缓存调用,一瞬间onCreate调用。所以

页面状况的源码编辑器编程猫变化时才干调用。可见–>不行见 或者 不行见–>可见嵌套
所以得先存下页面当时是否可见,然后状况变化了,在调用

ViewPager预加载、懒加载

  1. 因为setUserVisibleHint办法不是Fragment生命周期里的办法。所以当Fragment页面跳转的时分,不会走这个办法,所以要在onResume(), onPause() 里手动调用

ViewPager预加载、懒加载

  1. 即使这样还有bu嵌套if函数g。源码编辑器当页面多源码编程器层嵌套的时分,只要第一层Fragment能正常跑。后边几层的ViewPager仍是会跑预加载

外面一层V源码是什么意思iewPager + Fragment,里面还有一层ViewPager + Fragment的时分。
ViewPager预加载、懒加载

解决:里面那层得判别自己的parentFragment是不是可见的,可见的话自己才加载

ViewPager预加载、懒加载

ViewPager预加载、懒加载

  1. 这样还有bug,java模拟器便是有时分,内层的Fragment有时分该加载的时分,不加载,所以得手动分发一下

ViewPager预加载、懒加载

嵌套查询断的时分也相同
ViewPager预加载、懒加载