分析fragment中api(setUserVisibleHin

2020-07-10  本文已影响0人  爱你为你做饭
  1. fragment的生命周期不像activity的生命周期,activity的切换会触发前面activity的onpause,但是fragment的切换不一定会触发fragmengt的生命周期,比如在viewpager中fragment的切换不一定会走onresume和onpause(后面会详细分析)。
  2. 针对单个fragment,api(setUserVisibleHint)优先级高于onresume(设置了显示才会走onresume)
  3. 在viewpager中两者之间的关系如下:
    3.1. viewpager的加载机制是:加载第一项的同时预加载第二项,此时显示第一项但是维护了两个子view,滑动到第二项的时候预加载第三项,滑动到第三项的时候,预加载第四项,此时会回收第一项。即viewpager会始终维护三个view(当前显示和前后两个view)
    3.2. 由上面机制看到fragment在viewpager的生命周期(以onresume和onpause为例)为:
    先走0的onresume由于预加载同时会走1的onresume,滑动到1的时候会走2的onresume,滑动到2的时候会走3的onresume此时由于第一项被回收,所以0的onpause会被触发,继续向下滑动以此类推,若向上滑动到1的时候0会被重建,则走0的onresume,3被回收则3的onpause会被触发。
    两者之间的关系:针对第0项(第一次加载时的第一项),setUserVisibleHint优先级高于onresume,但是由于viewpager的预加载的存在,针对后面滑动onresume要优先于setUserVisibleHint。onpause则相反,onpause的优先级低于setUserVisibleHint()。
  4. 分析两者的关系要结合fragment所依赖的容器的机制去分析。
  5. setUserVisibleHint()并不是系统调用,而是在容器的切换中手动调用api,所以在某些容器中可能并没有处理这个逻辑。

参考文章:
分析setUserVisibleHint和OnhiddenChange和isVisible的坑

上一篇 下一篇

猜你喜欢

热点阅读