Glide源码解析:RequestManager工作原理
概述
RequestManager是Glide图片加载库的核心组件,负责管理和启动图片请求,并能利用Activity、Fragment和网络连接的生命周期事件来智能地停止、启动和重启请求。本文将深入解析RequestManager的工作原理,帮助开发者更好地理解Glide的内部机制。
RequestManager的初始化
RequestManager的实例化主要通过其构造函数完成。在构造过程中,RequestManager会初始化一系列关键组件,包括Lifecycle、RequestTracker和ConnectivityMonitor等。
public RequestManager(
@NonNull Glide glide,
@NonNull Lifecycle lifecycle,
@NonNull RequestManagerTreeNode treeNode,
@NonNull Context context) {
this(
glide,
lifecycle,
treeNode,
new RequestTracker(),
glide.getConnectivityMonitorFactory(),
context);
}
从上述代码可以看出,RequestManager的构造函数接收Glide实例、Lifecycle对象、RequestManagerTreeNode、RequestTracker、ConnectivityMonitorFactory和Context等参数。其中,Lifecycle用于监听生命周期事件,RequestTracker用于跟踪和管理请求,ConnectivityMonitor用于监听网络连接状态的变化。
生命周期管理
RequestManager实现了LifecycleListener接口,能够监听Activity或Fragment的生命周期事件,并据此管理图片请求的状态。
生命周期回调方法
RequestManager主要重写了以下生命周期回调方法:
@Override
public synchronized void onStart() {
resumeRequests();
targetTracker.onStart();
}
@Override
public synchronized void onStop() {
targetTracker.onStop();
if (clearOnStop) {
clearRequests();
} else {
pauseRequests();
}
}
@Override
public synchronized void onDestroy() {
targetTracker.onDestroy();
clearRequests();
requestTracker.clearRequests();
lifecycle.removeListener(this);
lifecycle.removeListener(connectivityMonitor);
Util.removeCallbacksOnUiThread(addSelfToLifecycle);
glide.unregisterRequestManager(this);
}
在onStart()方法中,RequestManager会调用resumeRequests()方法恢复请求,并通知TargetTracker开始跟踪Target。在onStop()方法中,RequestManager会暂停请求或清除请求,具体取决于clearOnStop标志的状态。在onDestroy()方法中,RequestManager会彻底清除所有请求,并解除对生命周期和网络连接的监听。
与Lifecycle的关联
RequestManager在初始化时会将自己添加到Lifecycle中,以便接收生命周期事件的通知:
if (Util.isOnBackgroundThread()) {
Util.postOnUiThread(addSelfToLifecycle);
} else {
lifecycle.addListener(this);
}
其中,addSelfToLifecycle是一个Runnable,用于在主线程将RequestManager添加到Lifecycle中:
private final Runnable addSelfToLifecycle =
new Runnable() {
@Override
public void run() {
lifecycle.addListener(RequestManager.this);
}
};
请求管理
RequestManager通过RequestTracker来管理图片请求的生命周期。RequestTracker是一个用于跟踪、取消和重启进行中、已完成和失败请求的类。
请求的启动与暂停
当调用RequestManager的resumeRequests()方法时,会通知RequestTracker恢复所有请求:
public synchronized void resumeRequests() {
requestTracker.resumeRequests();
}
RequestTracker的resumeRequests()方法会遍历所有请求,并对未完成且未运行的请求调用begin()方法:
public void resumeRequests() {
isPaused = false;
for (Request request : Util.getSnapshot(requests)) {
if (!request.isComplete() && !request.isRunning()) {
request.begin();
}
}
pendingRequests.clear();
}
相反,当调用pauseRequests()方法时,RequestManager会通知RequestTracker暂停所有请求:
public synchronized void pauseRequests() {
requestTracker.pauseRequests();
}
RequestTracker的pauseRequests()方法会暂停所有正在运行的请求,并将它们添加到待处理请求列表中:
public void pauseRequests() {
isPaused = true;
for (Request request : Util.getSnapshot(requests)) {
if (request.isRunning()) {
request.pause();
pendingRequests.add(request);
}
}
}
请求的清除
当需要清除所有请求时,RequestManager会调用clearRequests()方法:
private synchronized void clearRequests() {
requestTracker.clearRequests();
}
RequestTracker的clearRequests()方法会遍历所有请求,并调用clearAndRemove()方法来取消请求并释放资源:
public void clearRequests() {
for (Request request : Util.getSnapshot(requests)) {
clearAndRemove(request);
}
pendingRequests.clear();
}
网络连接监听
RequestManager通过ConnectivityMonitor来监听网络连接状态的变化。当网络连接状态发生变化时,ConnectivityMonitor会通知RequestTracker相应地处理请求。
connectivityMonitor =
factory.build(
context.getApplicationContext(),
new RequestManagerConnectivityListener(requestTracker));
RequestManagerConnectivityListener是一个ConnectivityListener,当网络连接恢复时,它会调用RequestTracker的restartRequests()方法来重启失败的请求:
private static class RequestManagerConnectivityListener implements ConnectivityMonitor.Listener {
private final RequestTracker requestTracker;
RequestManagerConnectivityListener(RequestTracker requestTracker) {
this.requestTracker = requestTracker;
}
@Override
public void onConnectivityChanged(boolean isConnected) {
if (isConnected) {
synchronized (requestTracker) {
requestTracker.restartRequests();
}
}
}
}
RequestBuilder的创建与使用
RequestManager提供了一系列asXxx()方法来创建不同类型的RequestBuilder,例如asDrawable()、asBitmap()、asGif()等。这些方法会创建一个新的RequestBuilder实例,并设置相应的解码类型和选项。
@NonNull
@CheckResult
public RequestBuilder<Drawable> asDrawable() {
return as(Drawable.class);
}
@NonNull
@CheckResult
public <ResourceType> RequestBuilder<ResourceType> as(
@NonNull Class<ResourceType> resourceClass) {
return new RequestBuilder<>(glide, this, resourceClass, context);
}
创建RequestBuilder后,开发者可以通过load()方法设置图片的数据源,并通过apply()方法应用各种请求选项。最后,调用into()方法将图片加载到目标View中。
Glide.with(this)
.load("https://example.com/image.jpg")
.apply(RequestOptions.centerCropTransform())
.into(imageView);
总结
RequestManager作为Glide的核心组件,通过与Lifecycle、RequestTracker和ConnectivityMonitor等组件的协作,实现了对图片请求的高效管理。它能够根据生命周期事件智能地暂停、恢复和清除请求,同时还能根据网络连接状态的变化来重启失败的请求,从而保证了图片加载的流畅性和高效性。
通过深入理解RequestManager的工作原理,开发者可以更好地使用Glide库,优化图片加载性能,并解决在实际开发中遇到的各种问题。
官方文档:README.md RequestManager源码:library/src/main/java/com/bumptech/glide/RequestManager.java RequestTracker源码:library/src/main/java/com/bumptech/glide/manager/RequestTracker.java Lifecycle源码:library/src/main/java/com/bumptech/glide/manager/Lifecycle.java
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




