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

50 阅读6分钟

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);

//省略部分代码

}

Lifecycle是用来添加和删除LifecycleListener,而ReqeustManager的构造方法里,将LifecycleListener添加到lifecycle里面。

看到这里,也就验证了我们的猜想了。ReqeustManager是来代理管理Request的生命周期方法,也就是请求的生命周期。glide就是通过ReqeustManager监听到Fragment的生命周期,从而根据生命周期管理让Request做出相对应的请求。

我们在使用glide的时候很简单,就是Glide.with(this).load(url).into(imageView);

glide的with方法返回的也是ReqeustManager类,这个过程中按顺序看下来,涉及两个关键方法,fragmentGet()getRequestManagerFragment(),相关的源码已经在以上讲解中贴出。

下面我将把获取到ReqeustManager这个过程中涉及的一些重要的方法和类做一些说明,只是我的个人理解,如有不对,欢迎指正。

fragmentGet()

1、调用getRequestManagerFragment()得到RequestManagerFragment,也就是Fragment的管理类。 从RequestManagerFragment拿到RequestManager和ActivityFragmentLifecycle

2、RequestManager如果不为空直接返回,如果为空则通过工厂创建一个RequestManager,并且将ActivityFragmentLifecycle传入。

getRequestManagerFragment()

1、得到RequestManagerFragment,也就是Fragment

2、将Fragment加入到Activity

RequestManagerFragment

1、Fragment的管理类,继承Fragment

2、在构造方法里创建ActivityFragmentLifecycle类

3、在Fragment的onStart()、onStop()、onDestroy()里调用ActivityFragmentLifecycle类里相应的方法。

ActivityFragmentLifecycle

1、实现Lifecycle接口

2、在Lifecycle的addListener(@NonNull LifecycleListener listener);里,将listener一一添加进LifecycleListener的集合,并且调用LifecycleListener相应的方法做一些操作,最终的目的是让每个RequestManager对应一个LifecycleListener

RequestManager

1、实现LifecycleListener接口

2、将RequestManager自身添加到lifecycle方法中,也就是ActivityFragmentLifecycle中,这样就可以监听到Fragment的生命周期。

glide还有很多很多的知识点,本篇文章只是介绍glide是如何关联上Activity的生命周期的,当我们在面试时候,能把实现的过程讲出来,我想这是会加分的。看懂源码,也就能在 面试过程中针对不同的问题去解答。

最后

要想面试成功进大厂,面试前的准备肯定是要很充分的。

自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的。

关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:

最后我在这里分享一下这段时间从朋友,大佬那里收集到的一些2019-2020BAT 面试真题解析,里面内容很多也很系统,包含了很多内容:Android 基础、Java 基础、Android 源码相关分析、常见的一些原理性问题等等,可以很好地帮助我们深刻理解Android相关知识点的原理以及面试相关知识

建议

当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

Android高级技术大纲

面试资料整理

资料领取

点击这里免费获取

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术