【Android面试技巧】当面试官问你glide的时候,是想问什么?glide生命周期如何实现?

本文详细解读了如何在Android应用中通过FragmentManager管理和跟踪Fragment的生命周期,特别关注了RequestManager如何通过监听Fragment的生命周期来控制网络请求。作者还介绍了关键类如ActivityFragmentLifecycle和RequestManager的实现,以及Glide如何利用这些机制进行请求的调度和管理。
摘要由CSDN通过智能技术生成

}

这部分代码涉及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);

//省略部分代码
}

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的生命周期。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

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

img

img

img

img

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

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后是今天给大家分享的一些独家干货:

【Android开发核心知识点笔记】

【Android思维脑图(技能树)】

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【Android高级架构视频学习资源】

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

oid核心高级技术PDF文档,BAT大厂面试真题解析】**

[外链图片转存中…(img-DJ3Wiaom-1713435108543)]

【Android高级架构视频学习资源】

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值