当前位置: 首页 > article >正文

Android开源库——Glide

Glide是什么?

Android的图像加载和缓存库,专注于平滑滚动

Glide的用法?

依赖

implementation 'com.github.bumptech.glide:glide:5.0.0-rc01'

使用过程

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView iv = findViewById(R.id.iv);
        Glide.with(this)
                .load("https://img2.baidu.com/it/u=618715884,3279759230&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1200")
                .into(iv);
    }

}

Glide源码解析

GeneratedAppGlideModule

用于自定义创建RequestManagerRetriever.RequestManagerFactory

abstract class GeneratedAppGlideModule extends AppGlideModule {
  @NonNull
  Set<Class<?>> getExcludedModuleClasses() {
    return new HashSet<>();
  }

  @Nullable
  RequestManagerRetriever.RequestManagerFactory getRequestManagerFactory() {
    return null;
  }
}

Glide

Glide是单例的,get()通过双重检验锁获取实例

  • getAnnotationGeneratedGlideModules()通过反射创建"com.bumptech.glide.GeneratedAppGlideModuleImpl"
  • 调用checkAndInitializeGlide()创建Glide
public class Glide implements ComponentCallbacks2 {

  private static volatile Glide glide;

  Glide(......) {}
	
  public static Glide get(@NonNull Context context) {
    if (glide == null) {
      GeneratedAppGlideModule annotationGeneratedModule =
          getAnnotationGeneratedGlideModules(context.getApplicationContext());
      synchronized (Glide.class) {
        if (glide == null) {
          checkAndInitializeGlide(context, annotationGeneratedModule);
        }
      }
    }

    return glide;
  }
  
  private static GeneratedAppGlideModule getAnnotationGeneratedGlideModules(Context context) {
    GeneratedAppGlideModule result = null;
    try {
      Class<GeneratedAppGlideModule> clazz =
          (Class<GeneratedAppGlideModule>)
              Class.forName("com.bumptech.glide.GeneratedAppGlideModuleImpl");
      result =
          clazz.getDeclaredConstructor(Context.class).newInstance(context.getApplicationContext());
    }.....
    return result;
  }
}

checkAndInitializeGlide()调用initializeGlide()通过GlideBuilder创建Glide,若上面无GeneratedAppGlideModuleImpl则requestManagerFactory为空

public class Glide implements ComponentCallbacks2 {
  static void checkAndInitializeGlide(
      @NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) {
    ......
    try {
      initializeGlide(context, generatedAppGlideModule);
    } finally {
      isInitializing = false;
    }
  }
  
  private static void initializeGlide(
      @NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) {
    initializeGlide(context, new GlideBuilder(), generatedAppGlideModule);
  }

  private static void initializeGlide(
      @NonNull Context context,
      @NonNull GlideBuilder builder,
      @Nullable GeneratedAppGlideModule annotationGeneratedModule) {

    .....
    RequestManagerRetriever.RequestManagerFactory factory =
        annotationGeneratedModule != null
            ? annotationGeneratedModule.getRequestManagerFactory()
            : null;
    builder.setRequestManagerFactory(factory);

    Glide glide = builder.build(applicationContext, manifestModules, annotationGeneratedModule);
    applicationContext.registerComponentCallbacks(glide);
    Glide.glide = glide;
  }
}

GlideBuilder的build()创建RequestManagerRetriever(上面说了传参为null)等对象构造Gilde和GlideContext

public class Glide implements ComponentCallbacks2 {

  @NonNull
  Glide build(
      @NonNull Context context,
      List<GlideModule> manifestModules,
      AppGlideModule annotationGeneratedGlideModule) {
    ......

    RequestManagerRetriever requestManagerRetriever =
        new RequestManagerRetriever(requestManagerFactory);

    return new Glide(
        context,
        engine,
        memoryCache,
        bitmapPool,
        arrayPool,
        requestManagerRetriever,
        connectivityMonitorFactory,
        logLevel,
        defaultRequestOptionsFactory,
        defaultTransitionOptions,
        defaultRequestListeners,
        manifestModules,
        annotationGeneratedGlideModule,
        experiments);
  }
  
  Glide(......) {
    ......

    GlideSupplier<Registry> registry =
        RegistryFactory.lazilyCreateAndInitializeRegistry(
            this, manifestModules, annotationGeneratedModule);

    ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory();
    glideContext =
        new GlideContext(
            context,
            arrayPool,
            registry,
            imageViewTargetFactory,
            defaultRequestOptionsFactory,
            defaultTransitionOptions,
            defaultRequestListeners,
            engine,
            experiments,
            logLevel);
  }
}

RequestManagerRetriever

DEFAULT_FACTORY为匿名内部类RequestManagerFactory,其build()创建RequestManager,并传给LifecycleRequestManagerRetriever

public class RequestManagerRetriever implements Handler.Callback {

  public RequestManagerRetriever(@Nullable RequestManagerFactory factory) {
    this.factory = factory != null ? factory : DEFAULT_FACTORY;
    lifecycleRequestManagerRetriever = new LifecycleRequestManagerRetriever(this.factory);
    frameWaiter = buildFrameWaiter();
  }
  
  public interface RequestManagerFactory {
    @NonNull
    RequestManager build(
        @NonNull Glide glide,
        @NonNull Lifecycle lifecycle,
        @NonNull RequestManagerTreeNode requestManagerTreeNode,
        @NonNull Context context);
  }

  private static final RequestManagerFactory DEFAULT_FACTORY =
      new RequestManagerFactory() {
        @NonNull
        @Override
        public RequestManager build(
            @NonNull Glide glide,
            @NonNull Lifecycle lifecycle,
            @NonNull RequestManagerTreeNode requestManagerTreeNode,
            @NonNull Context context) {
          return new RequestManager(glide, lifecycle, requestManagerTreeNode, context);
        }
      };
}

LifecycleLifecycle

将Acitivty的生命周期事件传给自己的LifecycleListener

final class LifecycleLifecycle implements Lifecycle, LifecycleObserver {
  @NonNull
  private final Set<LifecycleListener> lifecycleListeners = new HashSet<LifecycleListener>();

  @NonNull private final androidx.lifecycle.Lifecycle lifecycle;

  LifecycleLifecycle(androidx.lifecycle.Lifecycle lifecycle) {
    this.lifecycle = lifecycle;
    lifecycle.addObserver(this);
  }

  @OnLifecycleEvent(Event.ON_START)
  public void onStart(@NonNull LifecycleOwner owner) {
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStart();
    }
  }

  @OnLifecycleEvent(Event.ON_STOP)
  public void onStop(@NonNull LifecycleOwner owner) {
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStop();
    }
  }

  @OnLifecycleEvent(Event.ON_DESTROY)
  public void onDestroy(@NonNull LifecycleOwner owner) {
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onDestroy();
    }
    owner.getLifecycle().removeObserver(this);
  }

  @Override
  public void addListener(@NonNull LifecycleListener listener) {
    lifecycleListeners.add(listener);

    if (lifecycle.getCurrentState() == State.DESTROYED) {
      listener.onDestroy();
    } else if (lifecycle.getCurrentState().isAtLeast(State.STARTED)) {
      listener.onStart();
    } else {
      listener.onStop();
    }
  }

  @Override
  public void removeListener(@NonNull LifecycleListener listener) {
    lifecycleListeners.remove(listener);
  }
}

RequestManager

实现了LifecycleListener可以监听到Acitivity的生命周期,创建RequestTracker

public class RequestManager
    implements ComponentCallbacks2, LifecycleListener, ModelTypes<RequestBuilder<Drawable>> {
    
  public RequestManager(
      @NonNull Glide glide,
      @NonNull Lifecycle lifecycle,
      @NonNull RequestManagerTreeNode treeNode,
      @NonNull Context context) {
    this(
        glide,
        lifecycle,
        treeNode,
        new RequestTracker(),
        glide.getConnectivityMonitorFactory(),
        context);
  }

  @SuppressWarnings("PMD.ConstructorCallsOverridableMethod")
  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));

    glide.registerRequestManager(this);


    if (Util.isOnBackgroundThread()) {
      Util.postOnUiThread(addSelfToLifecycle);
    } else {
      lifecycle.addListener(this);
    }
    lifecycle.addListener(connectivityMonitor);

    defaultRequestListeners =
        new CopyOnWriteArrayList<>(glide.getGlideContext().getDefaultRequestListeners());
    setRequestOptions(glide.getGlideContext().getDefaultRequestOptions());
  }
}

  • Glide包含RequestManagerRetriever
  • RequestManagerRetriever中的RequestManagerFactory的build()创建RequestManager
  • RequestManager包含RequestTracker

with()过程

Glide的with()通过getRetriever()获取Glide中的RequestManagerRetriever,调用get()获取RequestManager

public static RequestManager with(@NonNull FragmentActivity activity) {
  return getRetriever(activity).get(activity);
}

private static RequestManagerRetriever getRetriever(@Nullable Context context) {
  return Glide.get(context).getRequestManagerRetriever();
}

RequestManagerRetriever的get()通过lifecycleRequestManagerRetriever的getOrCreate()返回RequestManager

public class RequestManagerRetriever implements Handler.Callback {

  @NonNull
  public RequestManager get(@NonNull FragmentActivity activity) {
    if (Util.isOnBackgroundThread()) {
      return get(activity.getApplicationContext());
    }
    .......
    frameWaiter.registerSelf(activity);
    boolean isActivityVisible = isActivityVisible(activity);
    Glide glide = Glide.get(activity.getApplicationContext());
    return lifecycleRequestManagerRetriever.getOrCreate(
        activity,
        glide,
        activity.getLifecycle(),
        activity.getSupportFragmentManager(),
        isActivityVisible);
  }
  
}

LifecycleRequestManagerRetriever

  • 通过HashMap管理Activity的Lifecycle和RequestManager的映射,Activity在onDestroy()时移除RequestManager
  • getOrCreate()调用getOnly()判断是否在map中,不在则通过DEFAULT_FACTORY的build()创建RequestManager
  • 若Activity当前已经可见则调用RequestManager的onStart()
final class LifecycleRequestManagerRetriever {

  @Synthetic final Map<Lifecycle, RequestManager> lifecycleToRequestManager = new HashMap<>();
  @NonNull private final RequestManagerFactory factory;

  LifecycleRequestManagerRetriever(@NonNull RequestManagerFactory factory) {
    this.factory = factory;
  }

  RequestManager getOnly(Lifecycle lifecycle) {
    Util.assertMainThread();
    return lifecycleToRequestManager.get(lifecycle);
  }

  RequestManager getOrCreate(
      Context context,
      Glide glide,
      final Lifecycle lifecycle,
      FragmentManager childFragmentManager,
      boolean isParentVisible) {
    Util.assertMainThread();
    RequestManager result = getOnly(lifecycle);
    if (result == null) {
      LifecycleLifecycle glideLifecycle = new LifecycleLifecycle(lifecycle);
      result =
          factory.build(
              glide,
              glideLifecycle,
              new SupportRequestManagerTreeNode(childFragmentManager),
              context);
      lifecycleToRequestManager.put(lifecycle, result);
      glideLifecycle.addListener(
          new LifecycleListener() {
            @Override
            public void onStart() {}

            @Override
            public void onStop() {}

            @Override
            public void onDestroy() {
              lifecycleToRequestManager.remove(lifecycle);
            }
          });

      if (isParentVisible) {
        result.onStart();
      }
    }
    return result;
  }
}

load()过程

RequestManager的load()调用asDrawable()获取RequestBuilder,调用其load()方法

public class RequestManager
    implements ComponentCallbacks2, LifecycleListener, ModelTypes<RequestBuilder<Drawable>> {
    
  public RequestBuilder<Drawable> load(@Nullable String string) {
    return asDrawable().load(string);
  }

  public RequestBuilder<Drawable> asDrawable() {
    return as(Drawable.class);
  }
  
  public <ResourceType> RequestBuilder<ResourceType> as(
      @NonNull Class<ResourceType> resourceClass) {
    return new RequestBuilder<>(glide, this, resourceClass, context);
  }
}

RequestBuilder的load()将url设置到model返回自身

public class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>>
    implements Cloneable, ModelTypes<RequestBuilder<TranscodeType>> {

  protected RequestBuilder(
      @NonNull Glide glide,
      RequestManager requestManager,
      Class<TranscodeType> transcodeClass,
      Context context) {
    this.glide = glide;
    this.requestManager = requestManager;
    this.transcodeClass = transcodeClass;
    this.context = context;
    this.transitionOptions = requestManager.getDefaultTransitionOptions(transcodeClass);
    this.glideContext = glide.getGlideContext();

    initRequestListeners(requestManager.getDefaultRequestListeners());
    apply(requestManager.getDefaultRequestOptions());
  }
    
  public RequestBuilder<TranscodeType> load(@Nullable String string) {
    return loadGeneric(string);
  }
  
  private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {
    if (isAutoCloneEnabled()) {
      return clone().loadGeneric(model);
    }
    this.model = model;
    isModelSet = true;
    return selfOrThrowIfLocked();
  }
 
}

into()过程

RequestBuilder的into()

  • 通过glideContext的buildImageViewTarget()返回DrawableImageViewTarget(transcodeClass即是上面创建RequestBuilder时传递的Drawable.class)
  • Executors.mainThreadExecutor()返回Executor,其execute()将runnable交给主线程的handler
public class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>>
    implements Cloneable, ModelTypes<RequestBuilder<TranscodeType>> {
    
  public ViewTarget<ImageView, TranscodeType> into(@NonNull ImageView view) {

    BaseRequestOptions<?> requestOptions = this;
    ......
    return into(
        glideContext.buildImageViewTarget(view, transcodeClass),
        /* targetListener= */ null,
        requestOptions,
        Executors.mainThreadExecutor());
  }
}

public class GlideContext extends ContextWrapper {
  @NonNull
  public <X> ViewTarget<ImageView, X> buildImageViewTarget(
      @NonNull ImageView imageView, @NonNull Class<X> transcodeClass) {
    return imageViewTargetFactory.buildTarget(imageView, transcodeClass);
  }
}

public class ImageViewTargetFactory {

  public <Z> ViewTarget<ImageView, Z> buildTarget(
      @NonNull ImageView view, @NonNull Class<Z> clazz) {
    if (Bitmap.class.equals(clazz)) {
      return (ViewTarget<ImageView, Z>) new BitmapImageViewTarget(view);
    } else if (Drawable.class.isAssignableFrom(clazz)) {
      return (ViewTarget<ImageView, Z>) new DrawableImageViewTarget(view);
    }......
  }
  
}

public final class Executors {

  private static final Executor MAIN_THREAD_EXECUTOR =
      new Executor() {
        @Override
        public void execute(@NonNull Runnable command) {
          Util.postOnUiThread(command);
        }
      };

  public static Executor mainThreadExecutor() {
    return MAIN_THREAD_EXECUTOR;
  }
}

public final class Util {
  public static void postOnUiThread(Runnable runnable) {
    getUiThreadHandler().post(runnable);
  }

  private static Handler getUiThreadHandler() {
    if (mainThreadHandler == null) {
      synchronized (Util.class) {
        if (mainThreadHandler == null) {
          mainThreadHandler = new Handler(Looper.getMainLooper());
        }
      }
    }
    return mainThreadHandler;
  }
}

RequestBuilder的into()

  • 调用buildRequest()创建Request的实现类SingleRequest
  • 调用RequestManager的clear()
  • 调用DrawableImageViewTarget的父类ViewTarget的setRequest()将requset设置到View的tag中
  • 调用RequestManager的track()
public class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>>
    implements Cloneable, ModelTypes<RequestBuilder<TranscodeType>> {
    
  private <Y extends Target<TranscodeType>> Y into(
      @NonNull Y target,
      @Nullable RequestListener<TranscodeType> targetListener,
      BaseRequestOptions<?> options,
      Executor callbackExecutor) {
    ......
    Request request = buildRequest(target, targetListener, options, callbackExecutor);

    ......

    requestManager.clear(target);
    target.setRequest(request);
    requestManager.track(target, request);

    return target;
  }
  
  private Request buildRequest(......) {
    return buildRequestRecursive(
        /* requestLock= */ new Object(),
        target,
        targetListener,
        /* parentCoordinator= */ null,
        transitionOptions,
        requestOptions.getPriority(),
        requestOptions.getOverrideWidth(),
        requestOptions.getOverrideHeight(),
        requestOptions,
        callbackExecutor);
  }
  
  private Request buildRequestRecursive(......) {
	......
    Request mainRequest =
        buildThumbnailRequestRecursive(
            requestLock,
            target,
            targetListener,
            parentCoordinator,
            transitionOptions,
            priority,
            overrideWidth,
            overrideHeight,
            requestOptions,
            callbackExecutor);

    if (errorRequestCoordinator == null) {
      return mainRequest;
    }
    ......
  }
  
  private Request buildThumbnailRequestRecursive(......) {
      .....
    if (thumbnailBuilder != null) {
        .....
    } else if (thumbSizeMultiplier != null) {
      .....
    } else {
      return obtainRequest(
          requestLock,
          target,
          targetListener,
          requestOptions,
          parentCoordinator,
          transitionOptions,
          priority,
          overrideWidth,
          overrideHeight,
          callbackExecutor);
    }
  }
  
  private Request obtainRequest(......) {
    return SingleRequest.obtain(
        context,
        glideContext,
        requestLock,
        model,
        transcodeClass,
        requestOptions,
        overrideWidth,
        overrideHeight,
        priority,
        target,
        targetListener,
        requestListeners,
        requestCoordinator,
        glideContext.getEngine(),
        transitionOptions.getTransitionFactory(),
        callbackExecutor);
  }
}

public abstract class ViewTarget<T extends View, Z> extends BaseTarget<Z> {

  public void setRequest(@Nullable Request request) {
    setTag(request);
  }
  
  private void setTag(@Nullable Object tag) {
    isTagUsedAtLeastOnce = true;
    view.setTag(tagId, tag);
  }
  
}

RequestManager的track()调用requestTracker的runRequest()

public class RequestManager
    implements ComponentCallbacks2, LifecycleListener, ModelTypes<RequestBuilder<Drawable>> {
    
  synchronized void track(@NonNull Target<?> target, @NonNull Request request) {
    ......
    requestTracker.runRequest(request);
  }
  
}

RequestTracker的runRequest()调用request的begin()

public class RequestTracker {
  public void runRequest(@NonNull Request request) {
    requests.add(request);
    if (!isPaused) {
      request.begin();
    } else {
      request.clear();
      ......
    }
  }
}

调用其实现类SingleRequest的begin(),判断当时state

  • 若overrideWidth和overrideHeight存在则调用onSizeReady(),否则调用ViewTarget的getSize(),最终还是调用onSizeReady()
  • 若state == RUNNING则调用ImageViewTarget的onLoadStarted()先设置placeholder
public final class SingleRequest<R> implements Request, SizeReadyCallback, ResourceCallback {

  @Override
  public void begin() {
    synchronized (requestLock) {
    
      if (Util.isValidDimensions(overrideWidth, overrideHeight)) {
        onSizeReady(overrideWidth, overrideHeight);
      } else {
        target.getSize(this);
      }
      ......
      if ((status == Status.RUNNING || status == Status.WAITING_FOR_SIZE)
          && canNotifyStatusChanged()) {
        target.onLoadStarted(getPlaceholderDrawable());
      }
  }
  
}

public abstract class ViewTarget<T extends View, Z> extends BaseTarget<Z> {

  public void getSize(@NonNull SizeReadyCallback cb) {
    sizeDeterminer.getSize(cb);
  }
  
  static final class SizeDeterminer {
    void getSize(@NonNull SizeReadyCallback cb) {
      int currentWidth = getTargetWidth();
      int currentHeight = getTargetHeight();
      if (isViewStateAndSizeValid(currentWidth, currentHeight)) {
        cb.onSizeReady(currentWidth, currentHeight);
        return;
      }
	  ......
    }
  }
}

public abstract class ImageViewTarget<Z> extends ViewTarget<ImageView, Z>
    implements Transition.ViewAdapter {
    
   public void onLoadStarted(@Nullable Drawable placeholder) {
    super.onLoadStarted(placeholder);
    setResourceInternal(null);
    setDrawable(placeholder);
  }
  
}

SingleRequest的onSizeReady()将状态设置为RUNNING,调用Engine的load(),注意这里将this传给Engine的cb域

public final class SingleRequest<R> implements Request, SizeReadyCallback, ResourceCallback {

  @Override
  public void onSizeReady(int width, int height) {
    stateVerifier.throwIfRecycled();
    synchronized (requestLock) {
      ......
      status = Status.RUNNING;

      ......
      loadStatus =
          engine.load(
              glideContext,
              model,
              requestOptions.getSignature(),
              this.width,
              this.height,
              requestOptions.getResourceClass(),
              transcodeClass,
              priority,
              requestOptions.getDiskCacheStrategy(),
              requestOptions.getTransformations(),
              requestOptions.isTransformationRequired(),
              requestOptions.isScaleOnlyOrNoTransform(),
              requestOptions.getOptions(),
              requestOptions.isMemoryCacheable(),
              requestOptions.getUseUnlimitedSourceGeneratorsPool(),
              requestOptions.getUseAnimationPool(),
              requestOptions.getOnlyRetrieveFromCache(),
              this,
              callbackExecutor);

     .....
    }
  }
}

Engine的load()先从内存中获取,若存在直接调用SingleRequest的onResourceReady()否则调用waitForExistingOrStartNewJob()

public class Engine
    implements EngineJobListener,
        MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {
        
  public <R> LoadStatus load(......) {
    long startTime = VERBOSE_IS_LOGGABLE ? LogTime.getLogTime() : 0;

    EngineKey key =
        keyFactory.buildKey(
            model,
            signature,
            width,
            height,
            transformations,
            resourceClass,
            transcodeClass,
            options);

    EngineResource<?> memoryResource;
    synchronized (this) {
      memoryResource = loadFromMemory(key, isMemoryCacheable, startTime);

      if (memoryResource == null) {
        return waitForExistingOrStartNewJob(
            glideContext,
            model,
            signature,
            width,
            height,
            resourceClass,
            transcodeClass,
            priority,
            diskCacheStrategy,
            transformations,
            isTransformationRequired,
            isScaleOnlyOrNoTransform,
            options,
            isMemoryCacheable,
            useUnlimitedSourceExecutorPool,
            useAnimationPool,
            onlyRetrieveFromCache,
            cb,
            callbackExecutor,
            key,
            startTime);
      }
    }

    cb.onResourceReady(
        memoryResource, DataSource.MEMORY_CACHE, /* isLoadedFromAlternateCacheKey= */ false);
    return null;
  }
}

Engine的waitForExistingOrStartNewJob()创建EngineJob、DecodeJob,addCallback()设置SingleRequest和callbackExecutor,调用start()启动

  • 这里的cbs为ResourceCallbackAndExecutor(包含SingleRequest和callbackExecutor)的list
public class Engine
    implements EngineJobListener,
        MemoryCache.ResourceRemovedListener,
        EngineResource.ResourceListener {
        
  private <R> LoadStatus waitForExistingOrStartNewJob(.....) {

    .....
    EngineJob<R> engineJob =
        engineJobFactory.build(
            key,
            isMemoryCacheable,
            useUnlimitedSourceExecutorPool,
            useAnimationPool,
            onlyRetrieveFromCache);

    DecodeJob<R> decodeJob =
        decodeJobFactory.build(
            glideContext,
            model,
            key,
            signature,
            width,
            height,
            resourceClass,
            transcodeClass,
            priority,
            diskCacheStrategy,
            transformations,
            isTransformationRequired,
            isScaleOnlyOrNoTransform,
            onlyRetrieveFromCache,
            options,
            engineJob);

    jobs.put(key, engineJob);

    engineJob.addCallback(cb, callbackExecutor);
    engineJob.start(decodeJob);

    if (VERBOSE_IS_LOGGABLE) {
      logWithTimeAndKey("Started new load", startTime, key);
    }
    return new LoadStatus(cb, engineJob);
  }
}

class EngineJob<R> implements DecodeJob.Callback<R>, Poolable {

  final ResourceCallbacksAndExecutors cbs = new ResourceCallbacksAndExecutors();

  synchronized void addCallback(final ResourceCallback cb, Executor callbackExecutor) {
    stateVerifier.throwIfRecycled();
    cbs.add(cb, callbackExecutor);
    ......
    }
  }
  
  static final class ResourceCallbacksAndExecutors
      implements Iterable<ResourceCallbackAndExecutor> {
      
    ResourceCallbacksAndExecutors() {
      this(new ArrayList<ResourceCallbackAndExecutor>(2));
    }
      
    void add(ResourceCallback cb, Executor executor) {
      callbacksAndExecutors.add(new ResourceCallbackAndExecutor(cb, executor));
    }
   }
}

EngineJob的start()创建GlideExecutor执行DecodeJob

class EngineJob<R> implements DecodeJob.Callback<R>, Poolable {

  public synchronized void start(DecodeJob<R> decodeJob) {
    this.decodeJob = decodeJob;
    GlideExecutor executor =
        decodeJob.willDecodeFromCache() ? diskCacheExecutor : getActiveSourceExecutor();
    executor.execute(decodeJob);
  }
}

DecodeJob的run()调用runWrapped()、decodeFromRetrievedData()、decodeFromData()解析资源,将resouce传给notifyEncodeAndRelease(),回调EngineJob的onResourceReady()

class DecodeJob<R>
    implements DataFetcherGenerator.FetcherReadyCallback,
        Runnable,
        Comparable<DecodeJob<?>>,
        Poolable {
        
  @Override
  public void run() {
    .......
    try {
      .......
      runWrapped();
    }.......
  }
  
  private void runWrapped() {
    switch (runReason) {
      .......
      case DECODE_DATA:
        decodeFromRetrievedData();
        break;
      default:
        throw new IllegalStateException("Unrecognized run reason: " + runReason);
    }
  }
  
  private void decodeFromRetrievedData() {
    ......
    Resource<R> resource = null;
    try {
      resource = decodeFromData(currentFetcher, currentData, currentDataSource);
    }......
    if (resource != null) {
      notifyEncodeAndRelease(resource, currentDataSource, isLoadingFromAlternateCacheKey);
    }......
  }
  
  private void notifyEncodeAndRelease(
      Resource<R> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey) {
      
      Resource<R> result = resource;
      ......
      notifyComplete(result, dataSource, isLoadedFromAlternateCacheKey);

     ......
    }
  }
  
  private void notifyComplete(
      Resource<R> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey) {
    setNotifiedOrThrow();
    callback.onResourceReady(resource, dataSource, isLoadedFromAlternateCacheKey);
  }
}

EngineJob的onResourceReady()调用notifyCallbacksOfResult(),遍历ResourceCallbackAndExecutor

  • entry.executor为在上面的addCallback()中添加的包含主线程hander的线程池
  • entry.cb为SingleRequset
  • 主线程调用run()、callCallbackOnResourceReady,最终回调SingleRequest的onResourceReady()
class EngineJob<R> implements DecodeJob.Callback<R>, Poolable {

  @Override
  public void onResourceReady(
      Resource<R> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey) {
    ......
    notifyCallbacksOfResult();
  }
  
  void notifyCallbacksOfResult() {
   synchronized (this) {
      .....
      copy = cbs.copy();
      .....
    }

    for (final ResourceCallbackAndExecutor entry : copy) {
      entry.executor.execute(new CallResourceReady(entry.cb));
    }
    .....
  }
  
  private class CallResourceReady implements Runnable {
  
	......
    @Override
    public void run() {
    
      synchronized (cb.getLock()) {
        synchronized (EngineJob.this) {
          if (cbs.contains(cb)) {
            engineResource.acquire();
            callCallbackOnResourceReady(cb);
            removeCallback(cb);
          }
          decrementPendingCallbacks();
        }
      }
    }
  }
  
  void callCallbackOnResourceReady(ResourceCallback cb) {
    try {
      cb.onResourceReady(engineResource, dataSource, isLoadedFromAlternateCacheKey);
    }......
  }
}

SingleRequest的onResourceReady()调用ImageViewTarget的onResourceReady()

public final class SingleRequest<R> implements Request, SizeReadyCallback, ResourceCallback {

  public void onResourceReady(
      Resource<?> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey) {
    ......
    try {
      synchronized (requestLock) {
       ......
        onResourceReady(
            (Resource<R>) resource, (R) received, dataSource, isLoadedFromAlternateCacheKey);
      }
    }
    ......
  }

  private void onResourceReady(
      Resource<R> resource, R result, DataSource dataSource, boolean isAlternateCacheKey) {
     ......

      if (!anyListenerHandledUpdatingTarget) {
        Transition<? super R> animation = animationFactory.build(dataSource, isFirstResource);
        target.onResourceReady(result, animation);
      }
    ......
  }
}

ImageViewTarget的onResourceReady()调用setResource()

public abstract class ImageViewTarget<Z> extends ViewTarget<ImageView, Z>
    implements Transition.ViewAdapter {
    
  @Override
  public void onResourceReady(@NonNull Z resource, @Nullable Transition<? super Z> transition) {
    if (transition == null || !transition.transition(resource, this)) {
      setResourceInternal(resource);
    } else {
      maybeUpdateAnimatable(resource);
    }
  }
  
  private void setResourceInternal(@Nullable Z resource) {
    setResource(resource);
    maybeUpdateAnimatable(resource);
  }
  
}

根据多态调用子类DrawableImageViewTarget的setResource()设置到view中

public class DrawableImageViewTarget extends ImageViewTarget<Drawable> {

  @Override
  protected void setResource(@Nullable Drawable resource) {
    view.setImageDrawable(resource);
  }
}

http://www.kler.cn/a/596802.html

相关文章:

  • Eclipse 快捷键
  • linux 脚本题
  • GO语言 单元测试
  • 计算机基础:编码04,认识反码和补码
  • html转png完美方案
  • Java进阶 面试速记
  • 第二十八篇 数据获取与数据分析:数仓体系下的专业化分工与协同
  • Docker与K8S是什么该怎么选?
  • VMware主机换到高配电脑,高版本系统的问题
  • 使用AI一步一步实现若依(20)
  • MySQL 事务(Transaction)详解
  • OSI通信模型
  • 搭建基于DNS主从架构、NFS共享存储及Nginx服务的完整环境
  • C++回顾 day1
  • 【Matlab笔记_22】Matlab地图矩阵左右置换
  • 阿里云国际站代理商:为什么边缘计算需要分布式防护?
  • 2025.3.22总结
  • DAY36贪心算法Ⅴ
  • linux内核数据结构分析之链表
  • 浅谈Qt事件子系统——以可拖动的通用Widget为例子