Glide源码解析:RequestManager工作原理

Glide源码解析:RequestManager工作原理

【免费下载链接】glide An image loading and caching library for Android focused on smooth scrolling 【免费下载链接】glide 项目地址: https://gitcode.com/gh_mirrors/gl/glide

概述

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库,优化图片加载性能,并解决在实际开发中遇到的各种问题。

Glide Logo

官方文档: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

【免费下载链接】glide An image loading and caching library for Android focused on smooth scrolling 【免费下载链接】glide 项目地址: https://gitcode.com/gh_mirrors/gl/glide

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值