【从源码上提升Android】当面试官问你glide的时候,是想问什么?glide生命周期如何实现?

final Map<android.app.FragmentManager, RequestManagerFragment> pendingRequestManagerFragments =

new HashMap<>();

private RequestManagerFragment getRequestManagerFragment(

@NonNull final android.app.FragmentManager fm,

@Nullable android.app.Fragment parentHint,

boolean isParentVisible) {

RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);//获取Fragment

if (current == null) {

current = pendingRequestManagerFragments.get(fm);

if (current == null) {

current = new RequestManagerFragment();

current.setParentFragmentHint(parentHint);

if (isParentVisible) {

current.getGlideLifecycle().onStart();

}

pendingRequestManagerFragments.put(fm, current);//保存到map集合

fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();//添加到Actvity中

handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();

}

}

return current;

}

这部分代码涉及FragmentManager的使用,忘了怎么使用的朋友可以去复习一下。**代码不难理解,就是一个目的,得到Fragment并且返回这个Fragment。**先通过findFragmentByTag获取,如果为null,则会从pendingRequestManagerFragments这个Map集合去获取,如果还是为null,则直接new 一个Fragment,并且保存到pendingRequestManagerFragments以及添加到Activity中。**这部分的代码就是Fragment和Actvity关联上了,这样就可以通过Fragment得知当前Activty的生命周期。**追踪RequestManagerFragment,看看它的生命周期里面做了什么操作,源码如下:

private final ActivityFragmentLifecycle lifecycle;

@Override

public void onStart() {

super.onStart();

lifecycle.onStart();

}

@Override

public void onStop() {

super.onStop();

lifecycle.onStop();

}

@Override

public void onDestroy() {

super.onDestroy();

lifecycle.onDestroy();

unregisterFragmentWithRoot();

}

Fragment的的生命周期里(我们只关注贴出代码的三个生命周期),ActivityFragmentLifecycle类都调用了相同名字的方法,接下来看看ActivityFragmentLifecycle的相应方法里面有什么操作。

private final Set lifecycleListeners =

Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());

void onStart() {

isStarted = true;

for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {

lifecycleListener.onStart();

}

}

void onStop() {

isStarted = false;

for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {

lifecycleListener.onStop();

}

}

void onDestroy() {

isDestroyed = true;

for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {

lifecycleListener.onDestroy();

}

}

相应的方法里都调用了LifecycleListener的相关方法,LifecycleListener是一个接口,作用在源码里写得很清楚:An interface for listener to lifecycle events.,监听生命周期的接口。既然是个接口,就找出实现它的类,实现LifecycleListener的类是RequestManager。RequestManager类,它实现了LifecycleListener接口,三个方法里面的内容如下。

/**

  • Lifecycle callback that registers for connectivity events (if the

  • android.permission.ACCESS_NETWORK_STATE permission is present) and restarts failed or paused

  • requests.

*/

@Override

public synchronized void onStart() {

resumeRequests();

targetTracker.onStart();

}

/**

  • Lifecycle callback that unregisters for connectivity events (if the

  • android.permission.ACCESS_NETWORK_STATE permission is present) and pauses in progress loads.

*/

@Override

public synchronized void onStop() {

pauseRequests();

targetTracker.onStop();

}

/**

  • Lifecycle callback that cancels all in progress requests and clears and recycles resources for

  • all completed requests.

*/

@Override

public synchronized void onDestroy() {

targetTracker.onDestroy();

for (Target<?> target : targetTracker.getAll()) {

clear(target);

}

targetTracker.clear();

requestTracker.clearRequests();

lifecycle.removeListener(this);

lifecycle.removeListener(connectivityMonitor);

mainHandler.removeCallbacks(addSelfToLifecycle);

glide.unregisterRequestManager(this);

}

requestTracker是用来追踪取消和重新启动正在进行,已完成和失败的请求。看到这里我们可以猜想,RequestManagerFragment生命周期变化的时候回调RequestManager的onStart、onStop、onDestroy方法,然后Request就做出相应的操作,Activity的生命周期是和Request的生命周期绑定起来。要验证这个猜想,就要找到RequestManager是怎么样监听到Fragment的生命周期的。我们来看看RequestManager的创建

private RequestManager fragmentGet(

@NonNull Context context,

@NonNull android.app.FragmentManager fm,

@Nullable android.app.Fragment parentHint,

boolean isParentVisible) {

RequestManagerFragment current = getRequestManagerFragment(fm, parentHint, isParentVisible);

RequestManager requestManager = current.getRequestManager();

if (requestManager == null) {

// TODO(b/27524013): Factor out this Glide.get() call.

Glide glide = Glide.get(context);

requestManager =

factory.build(

glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);

current.setRequestManager(requestManager);//将Fragment的lifecycle交给RequestManager管理

}

return requestManager;

}

以上代码说明,通过工厂模式创建RequestManager,并且将Fragment的lifecycle交给RequestManager管理,代码current.getGlideLifecycle()就是获取到lifecycle。再回头去看ReqeustManager,找到了lifecycle操作LifecycleListener的代码,在构造器将LifecycleListener添加到lifecycle,源码如下:

RequestManager(

Glide glide,

Lifecycle lifecycle,

RequestManagerTreeNode treeNode,

RequestTracker requestTracker,

ConnectivityMonitorFactory factory,

Context context) {

this.glide = glide;

this.lifecycle = lifecycle;

this.treeNode = treeNode;

this.requestTracker = requestTracker;

this.context = context;

connectivityMonitor =

factory.build(

context.getApplicationContext(),

new RequestManagerConnectivityListener(requestTracker));

//省略部分代码

if (Util.isOnBackgroundThread()) {

mainHandler.post(addSelfToLifecycle);

} else {

lifecycle.addListener(this);

}

lifecycle.addListener(connectivityMonitor);

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-m2KJTVSl-1715160050735)]

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

[外链图片转存中…(img-Buay0Dog-1715160050735)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值