Android面试题避坑:ViewPager中的Framgent如何实现懒加载?

} else {

mCurrentPrimaryItem.setUserVisibleHint(false);

}

}

fragment.setMenuVisibility(true);

if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

// 设置新滑到的主item的Lifecycle为RESUMED

mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED);

} else {

fragment.setUserVisibleHint(true);

}

mCurrentPrimaryItem = fragment;

}

}

不借助 behavior,在自定义Adapter中构建 Framgent时直接调用setMaxLifecycle 也是等价的。

setMaxLifecycle 实现原理

setMaxLifecycle 使用方法很简单,接下来通过梳理源码了解一下实现原理(基于1.3.0-rc01),即使面试官追问其原理你也能沉着应对。

OP_SET_MAX_LIFECYCLE

我们知道 FramgentTransition 对 Fragment 的所有操作都将转换为一个Op,针对setMaxLifecycle也同样增加了一个新的Op – OP_SET_MAX_LIFECYCLE, 专门用来设置生命周期的上限。

@NonNull

public FragmentTransaction setMaxLifecycle(@NonNull Fragment fragment,

@NonNull Lifecycle.State state) {

addOp(new Op(OP_SET_MAX_LIFECYCLE, fragment, state));

return this;

}

当 FramgentTransition 对 Frament 添加了 OP_SET_MAX_LIFECYCLE 后,在实现类 BackStackRecord 中, FragmentManager 会遍历 Transaction 的 Op 列表

void executeOps() {

final int numOps = mOps.size();

for (int opNum = 0; opNum < numOps; opNum++) {

final Op op = mOps.get(opNum);

final Fragment f = op.mFragment;

//…

switch (op.mCmd) {

//…

// 新引入的这个Op类型, 在这里会给这个Fragment设置允许的生命周期上限

case OP_SET_MAX_LIFECYCLE:

mManager.setMaxLifecycle(f, op.mCurrentMaxState);

break;

//…

}

}

当遇到 OP_SET_MAX_LIFECYCLE 时,通过调用 FragmentManager 的 setMaxLifeCycle 方法设置 fragment 的 mMaxState,以标记其生命周期上限

void setMaxLifecycle(@NonNull Fragment f, @NonNull Lifecycle.State state) {

//…

f.mMaxState = state;

}

FragmentStateManager

FragmentManager 通过 FragmentStateManager 推进 Fragment 的生命周期。 推进过程中根据 mMaxState 对生命周期

值得一提的是,FragmentStateManager 是 1.3.0-alpha08 之后新增的类,将原来和 State 相关的逻辑从FragmentManager 抽离了出来, 降低了与 Fragment 的耦合, 职责更加单一。

看一下在 FragmentStateManager 中具体是如何推进 Fragment 生命周期的:

void moveToExpectedState() {

try {

// 循环计算声明周期是否可以推进

while ((newState = computeExpectedState()) != mFragment.mState) {

if (newState > mFragment.mState) {

// 生命周期向前推进

int nextStep = mFragment.mState + 1;

//…

switch (nextStep) {

//…

case Fragment.ACTIVITY_CREATED:

//…

case Fragment.STARTED:

start();

break;

//…

case Fragment.RESUMED:

resume();

break;

}

} else {

// 如果应有的生命周期小于当前, 后退

int nextStep = mFragment.mState - 1;

//…

switch (nextStep) {

// 与上面的switch类似

//…

}

}

}

}

}

int computeExpectedState() {

// 其他计算expected state的逻辑, 算出maxState

//…

// mMaxState 对生命周期做出限制

switch (mFragment.mMaxState) {

case RESUMED:

break;

case STARTED:

maxState = Math.min(maxState, Fragment.STARTED);

break;

case CREATED:

maxState = Math.min(maxState, Fragment.CREATED);

break;

default:

maxState = Math.min(maxState, Fragment.INITIALIZING);

}

// 其他计算expected state的逻辑, 算出 maxState

// …

return maxState;

}

整体流程图如下

最后

除了使用默认的 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT,我们甚至可以在自定义 Adapter 的instantiateItem 中为将 Fragment的 MaxLifecycle 设置为 CREATED, 这样可以让 Fragment 只走到onCreate 从而延迟更多操作,比如在 onCreateView 中的 inflate 以及 onViewCreated 中的一些操作。 Fragment 1.3.0-rc01 已经支持设置最大生命周期为 INITIALIZED

面试前复习路线参考

接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用

**帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。**无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这份资料中有所一些收获。

从架构基础开始,分了8个模块来逐步从基础进阶到架构师的环节:

多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!

首先是超级详细得不能再详细的Android开发学习思维导图,因为图片实在是太大了,所以我就只把二级目录的内容放出来,更加详细的你们可以点击**这里**。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)
img

结尾

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

2)]

结尾

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

[外链图片转存中…(img-RCdVoPv6-1711555825673)]

[外链图片转存中…(img-MhF5OfoS-1711555825674)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值