Glide源码基本流程跑通

with
public static RequestManager with(Activity activity) {
    //单例返回RequestManagerRetriever对象,构造中对应主线程
    RequestManagerRetriever retriever = RequestManagerRetriever.get();
    //多个重载方法
    return retriever.get(activity);//[1.1]
}
1.1 RequestManagerRetriever.get()
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public RequestManager get(Activity activity) {
    //低版本或者子线程中无法管理生命周期
    if (Util.isOnBackgroundThread() || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
        return get(activity.getApplicationContext());
    } else {
        assertNotDestroyed(activity);
        //得到FragmentManager
        android.app.FragmentManager fm = activity.getFragmentManager();
        return fragmentGet(activity, fm);//[1.2]
    }
}
1.2 RequestManagerRetriever.fragmentGet()

由于生命周期在RequestManagerFragment中掌控,所以必须有核心类RequestManager做支持处理

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
RequestManager fragmentGet(Context context, android.app.FragmentManager fm) {
    //得到的RequestManagerFragment是一个继承自Fragment的对象,并且绑定到了Activity中,所以生命周期同步
    //内部可以通过ActivityFragmentLifecycle这个对象进行生命周期方法的处理
    RequestManagerFragment current = getRequestManagerFragment(fm);
    //首次肯定为null
    RequestManager requestManager = current.getRequestManager();
    if (requestManager == null) {
        requestManager = new RequestManager(context, current.getLifecycle(), current.getRequestManagerTreeNode());
        //将生成的RequestManager设置到RequestManagerFragment内部
        current.setRequestManager(requestManager);
    }
    return requestManager;
}

具体生命周期做了什么可以看RequestManagerFragment内部实现

现在看RequestManager类

RequestManager.java

在这里插入图片描述

public RequestManager(Context context, Lifecycle lifecycle, RequestManagerTreeNode treeNode) {
    this(context, lifecycle, treeNode, new RequestTracker(), new ConnectivityMonitorFactory());
}
RequestManager(Context context, final Lifecycle lifecycle, RequestManagerTreeNode treeNode,
        RequestTracker requestTracker, ConnectivityMonitorFactory factory) {
    this.context = context.getApplicationContext();
    this.lifecycle = lifecycle;//ActivityFragmentLifecycle
    this.treeNode = treeNode;//RequestManagerTreeNode
    this.requestTracker = requestTracker;//RequestTracker
    this.glide = Glide.get(context);
    this.optionsApplier = new OptionsApplier();
    //通过工厂构造一个连接监听器,工厂内部通过权限做判断,有网络情况使用DefaultConnectivityMonitor
    //内部有个广播接收器,如果收到广播则调用requestTracker中的restartRequests重启请求方法
    ConnectivityMonitor connectivityMonitor = factory.build(context,
            new RequestManagerConnectivityListener(requestTracker));
    
    //增加生命周期监听,这样就把生命周期回调的方法移植到RequestManager中
    if (Util.isOnBackgroundThread()) {
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                lifecycle.addListener(RequestManager.this);
            }
        });
    } else {
        lifecycle.addListener(this);
    }
    //同样的,在生命周期的过程中有对链接的处理DefaultConnectivityMonitor
    lifecycle.addListener(connectivityMonitor);
}

由此可以看出RequestManager作为一个大类负责掌控这生命周期回调的大全,所以这里是核心中的核心也是一个掌控者。
当然,但是掌控者具体不做处理,只是作为管理,那么谁才是处理呢?那就是glide对象,下面分析此构造方法。

Glide

自定义model使用

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <meta-data
        android:name="com.example.lizejun.repoglidelearn.CustomGlideModule"
        android:value="GlideModule"/>
</application>
public class CustomGlideModule implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        //通过builder.setXXX进行配置.
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        //通过glide.register进行配置.
    }
}
public static Glide get(Context context) {
    if (glide == null) {
        synchronized (Glide.class) {
            if (glide == null) {
                Context applicationContext = context.getApplicationContext();
                //根据GlideModule标记进行解析,将反射的GlideModule放入列表中
                List<GlideModule> modules = new ManifestParser(applicationContext).parse();

                GlideBuilder builder = new GlideBuilder(applicationContext);
                for (GlideModule module : modules) {
                    //调用自定义model的实现方法applyOptions
                    module.applyOptions(applicationContext, builder);
                }
                //创造Glide对象
                glide = builder.createGlide();
                for (GlideModule module : modules) {
                    //进行注册
                    module.registerComponents(applicationContext, glide);
                }
            }
        }
    }
    return glide;
}
Glide createGlide() {
    //创建自己的线程池
    if (sourceService == null) {
        final int cores = Math.max(1, Runtime.getRuntime().availableProcessors());
        sourceService = new FifoPriorityThreadPoolExecutor(cores);
    }
    //再来一个线程池
    if (diskCacheService == null) {
        diskCacheService = new FifoPriorityThreadPoolExecutor(1);
    }
    //内存计算类
    MemorySizeCalculator calculator = new MemorySizeCalculator(context);
    //搞一个bitmap池
    if (bitmapPool == null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            int size = calculator.getBitmapPoolSize();
            bitmapPool = new LruBitmapPool(size);
        } else {
            bitmapPool = new BitmapPoolAdapter();
        }
    }
    //资源缓存
    if (memoryCache == null) {
        memoryCache = new LruResourceCache(calculator.getMemoryCacheSize());
    }
    //磁盘缓存
    if (diskCacheFactory == null) {
        diskCacheFactory = new InternalCacheDiskCacheFactory(context);
    }
    //处理引擎
    if (engine == null) {
        engine = new Engine(memoryCache, diskCacheFactory, diskCacheService, sourceService);
    }
    //默认编码
    if (decodeFormat == null) {
        decodeFormat = DecodeFormat.DEFAULT;
    }
    //创建这些组合对象完成之后构造Glide
    return new Glide(engine, memoryCache, bitmapPool, context, decodeFormat);
}
  • 资源缓存
  • 磁盘缓存
  • bitmap缓存
  • 默认编码格式
  • 处理引擎
    • 磁盘线程池
    • 来源线程池

继续来到Glide构造

Glide(Engine engine, MemoryCache memoryCache, BitmapPool bitmapPool, Context context, DecodeFormat decodeFormat) {
    this.engine = engine;
    this.bitmapPool = bitmapPool;
    this.memoryCache = memoryCache;
    this.decodeFormat = decodeFormat;
    //各种加载方案的生成器
    loaderFactory = new GenericLoaderFactory(context);
    mainHandler = new Handler(Looper.getMainLooper());
    //bitmap的过滤器
    bitmapPreFiller = new BitmapPreFiller(memoryCache, bitmapPool, decodeFormat);
    //数据源注册器
    dataLoadProviderRegistry = new DataLoadProviderRegistry();
    //下面就是各种数据源注册
    StreamBitmapDataLoadProvider streamBitmapLoadProvider =
            new StreamBitmapDataLoadProvider(bitmapPool, decodeFormat);
    dataLoadProviderRegistry.register(InputStream.class, Bitmap.class, streamBitmapLoadProvider);

    FileDescriptorBitmapDataLoadProvider fileDescriptorLoadProvider =
            new FileDescriptorBitmapDataLoadProvider(bitmapPool, decodeFormat);
    dataLoadProviderRegistry.register(ParcelFileDescriptor.class, Bitmap.class, fileDescriptorLoadProvider);

    ImageVideoDataLoadProvider imageVideoDataLoadProvider =
            new ImageVideoDataLoadProvider(streamBitmapLoadProvider, fileDescriptorLoadProvider);
    dataLoadProviderRegistry.register(ImageVideoWrapper.class, Bitmap.class, imageVideoDataLoadProvider);

    GifDrawableLoadProvider gifDrawableLoadProvider =
            new GifDrawableLoadProvider(context, bitmapPool);
    dataLoadProviderRegistry.register(InputStream.class, GifDrawable.class, gifDrawableLoadProvider);

    dataLoadProviderRegistry.register(ImageVideoWrapper.class, GifBitmapWrapper.class,
            new ImageVideoGifDrawableLoadProvider(imageVideoDataLoadProvider, gifDrawableLoadProvider, bitmapPool));

    dataLoadProviderRegistry.register(InputStream.class, File.class, new StreamFileDataLoadProvider());



    //注册不同模型
    register(File.class, ParcelFileDescriptor.class, new FileDescriptorFileLoader.Factory());
    register(File.class, InputStream.class, new StreamFileLoader.Factory());
    register(int.class, ParcelFileDescriptor.class, new FileDescriptorResourceLoader.Factory());
    register(int.class, InputStream.class, new StreamResourceLoader.Factory());
    register(Integer.class, ParcelFileDescriptor.class, new FileDescriptorResourceLoader.Factory());
    register(Integer.class, InputStream.class, new StreamResourceLoader.Factory());
    register(String.class, ParcelFileDescriptor.class, new FileDescriptorStringLoader.Factory());
    register(String.class, InputStream.class, new StreamStringLoader.Factory());
    register(Uri.class, ParcelFileDescriptor.class, new FileDescriptorUriLoader.Factory());
    register(Uri.class, InputStream.class, new StreamUriLoader.Factory());
    register(URL.class, InputStream.class, new StreamUrlLoader.Factory());
    register(GlideUrl.class, InputStream.class, new HttpUrlGlideUrlLoader.Factory());
    register(byte[].class, InputStream.class, new StreamByteArrayLoader.Factory());


    //转换器的注册
    transcoderRegistry.register(Bitmap.class, GlideBitmapDrawable.class,
            new GlideBitmapDrawableTranscoder(context.getResources(), bitmapPool));
    transcoderRegistry.register(GifBitmapWrapper.class, GlideDrawable.class,
            new GifBitmapWrapperDrawableTranscoder(
                    new GlideBitmapDrawableTranscoder(context.getResources(), bitmapPool)));

    //裁剪注册
    bitmapCenterCrop = new CenterCrop(bitmapPool);
    drawableCenterCrop = new GifBitmapWrapperTransformation(bitmapPool, bitmapCenterCrop);

    //位图大小适配器注册
    bitmapFitCenter = new FitCenter(bitmapPool);
    drawableFitCenter = new GifBitmapWrapperTransformation(bitmapPool, bitmapFitCenter);
}

我们这个时候需要分析一下DataLoadProviderRegistry.register和GenericLoaderFactory.register到底是干什么的有什么作用

//DataLoadProviderRegistry
//在StreamBitmapDataLoadProvider中定义了
StreamBitmapDataLoadProvider streamBitmapLoadProvider = new StreamBitmapDataLoadProvider(bitmapPool, decodeFormat);
dataLoadProviderRegistry.register(InputStream.class, Bitmap.class, streamBitmapLoadProvider);
public StreamBitmapDataLoadProvider(BitmapPool bitmapPool, DecodeFormat decodeFormat) {
    sourceEncoder = new StreamEncoder();//流编码器,用于将原始数据写入磁盘
    decoder = new StreamBitmapDecoder(bitmapPool, decodeFormat);//解码器,用于从原始数据解码资源
    encoder = new BitmapEncoder();//位图编码器,用于将已经解码的资源写入磁盘
    cacheDecoder = new FileToStreamDecoder<Bitmap>(decoder);//用于解码磁盘中缓存中的资源
}

然后在分析DataLoadProviderRegistry.register方法

public <T, Z> void register(Class<T> dataClass, Class<Z> resourceClass, DataLoadProvider<T, Z> provider) {
    //MultiClassKey是将两种类型绑定起来当成一种类型进行处理
    providers.put(new MultiClassKey(dataClass, resourceClass), provider);
}

也就是说,dataProvider的处理是将这些数据的写入和读取做封装,用组合作为key,具体的key有:

  • InputStream.class, Bitmap.class
  • ParcelFileDescriptor.class, Bitmap.class
  • ImageVideoWrapper.class, Bitmap.class
  • InputStream.class, GifDrawable.class
  • ImageVideoWrapper.class, GifBitmapWrapper.class
  • InputStream.class, File.class

然后在分析Glide.register

在这里插入图片描述

先看内部结构

public <T, Y> void register(Class<T> modelClass, Class<Y> resourceClass, ModelLoaderFactory<T, Y> factory) {
    ModelLoaderFactory<T, Y> removed = loaderFactory.register(modelClass, resourceClass, factory);
    if (removed != null) {
        removed.teardown();
    }
}

其中用到了loaderFactory,这个是在Glide构造时候产生的,对应类型是GenericLoaderFactory

public <T, Y> void register(Class<T> modelClass, Class<Y> resourceClass, ModelLoaderFactory<T, Y> factory) {
    ModelLoaderFactory<T, Y> removed = loaderFactory.register(modelClass, resourceClass, factory);
    if (removed != null) {
        removed.teardown();
    }
}
public synchronized <T, Y> ModelLoaderFactory<T, Y> register(Class<T> modelClass, Class<Y> resourceClass,
        ModelLoaderFactory<T, Y> factory) {
    cachedModelLoaders.clear();

    Map<Class/*Y*/, ModelLoaderFactory/*T, Y*/> resourceToFactories = modelClassToResourceFactories.get(modelClass);
    if (resourceToFactories == null) {
        resourceToFactories = new HashMap<Class/*Y*/, ModelLoaderFactory/*T, Y*/>();
        modelClassToResourceFactories.put(modelClass, resourceToFactories);
    }

    ModelLoaderFactory/*T, Y*/ previous = resourceToFactories.put(resourceClass, factory);

    //下面操作是去掉重复的老值
    if (previous != null) {
        // This factory may be being used by another model. We don't want to say it has been removed unless we
        // know it has been removed for all models.
        for (Map<Class/*Y*/, ModelLoaderFactory/*T, Y*/> factories : modelClassToResourceFactories.values()) {
            if (factories.containsValue(previous)) {
                previous = null;
                break;
            }
        }
    }
    return previous;
}

这里注意hashmap的put方法,如果put成功了则返回null,如果key重复了,就返回原来的值

看下这块数据结构:

private final Map<Class , Map<Class, ModelLoaderFactory>> modelClassToResourceFactories = new HashMap<Class, Map<Class, ModelLoaderFactory>>();

第一个class是modelClass,第二个class是resourceClass,ModelLoaderFactory是factory

那也就是说,主要是用模型来映射资源类和工厂类

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
然后总结效果图:

- File对应的如下:
    - ParcelFileDescriptor:FileDescriptorFileLoader
    - InputStream:StreamFileLoader
- int:
    - ParcelFileDescriptor:FileDescriptorResourceLoader
    - InputStream:StreamResourceLoader
- Integer:
    - ParcelFileDescriptor:FileDescriptorResourceLoader
    - InputStream:StreamResourceLoader
- String:
    - ParcelFileDescriptor:FileDescriptorStringLoader
    - InputStream:StreamStringLoader
- Uri:
    - ParcelFileDescriptor:FileDescriptorUriLoader
    - InputStream:StreamUriLoader

- URL:
    - InputStream:StreamUrlLoader
- GlideUrl:
    - InputStream:HttpUrlGlideUrlLoader
- byte:
    - InputStream:StreamByteArrayLoader

我们大概看一眼工厂都干啥

public interface ModelLoaderFactory<T, Y> {
    ModelLoader<T, Y> build(Context context, GenericLoaderFactory factories);
    void teardown();
}
public static class Factory implements ModelLoaderFactory<String, InputStream> {
    public Factory() {
    }
    //主要方法是build,进行构造对应类
    public ModelLoader<String, InputStream> build(Context context, GenericLoaderFactory factories) {
        return new StreamStringLoader(factories.buildModelLoader(Uri.class, InputStream.class));
    }

    public void teardown() {
    }
}

所以工厂类就是专门提供创建获取资源的数据的类。


小结:

DataLoadProviderRegistry注册器注册了什么:

//注册进了
Map<MultiClassKey, DataLoadProvider<?, ?>> providers;
providers.put(new MultiClassKey(dataClass, resourceClass), provider);
  • InputStream
    • Bitmap : StreamBitmapDataLoadProvider
    • GifDrawable : GifDrawableLoadProvider
    • File : StreamFileDataLoadProvider
  • ParcelFileDescriptor
    • Bitmap : FileDescriptorBitmapDataLoadProvider
  • ImageVideoWrapper
    • Bitmap : ImageVideoDataLoadProvider
    • GifBitmapWrapper : ImageVideoGifDrawableLoadProvider

GenericLoaderFactory.loaderFactory注册器注册了什么:

//注册进了
Map<Class/*T*/, Map<Class/*Y*/, ModelLoaderFactory/*T, Y*/>> modelClassToResourceFactories;
  • File
    • ParcelFileDescriptor : FileDescriptorFileLoader
    • InputStream : StreamFileLoader
  • int
    • ParcelFileDescriptor : FileDescriptorResourceLoader
    • InputStream : StreamResourceLoader
  • Integer
    • ParcelFileDescriptor : FileDescriptorResourceLoader
    • InputStream : StreamResourceLoader
  • String
    • ParcelFileDescriptor:FileDescriptorStringLoader
    • InputStream:StreamStringLoader
  • Uri
    • ParcelFileDescriptor:FileDescriptorUriLoader
    • InputStream:StreamUriLoader
  • URL
    • InputStream:StreamUrlLoader
  • GlideUrl
    • InputStream:HttpUrlGlideUrlLoader
  • byte
    • InputStream:StreamByteArrayLoader

TranscoderRegistry.transcoderRegistry注册器注册了什么:

//同理这个注册进了
Map<MultiClassKey, ResourceTranscoder<?, ?>> factories;
factories.put(new MultiClassKey(decodedClass, transcodedClass), transcoder);
  • Bitmap
    • GlideBitmapDrawable : GlideBitmapDrawableTranscoder
  • GifBitmapWrapper
    • GlideDrawable : GifBitmapWrapperDrawableTranscoder

load
public DrawableTypeRequest<String> load(String string) {
    return (DrawableTypeRequest<String>) fromString().load(string);
}
public DrawableTypeRequest<Uri> load(Uri uri) {
    return (DrawableTypeRequest<Uri>) fromUri().load(uri);
}
public DrawableTypeRequest<File> load(File file) {
    return (DrawableTypeRequest<File>) fromFile().load(file);
}

从fromString()开始分析

public DrawableTypeRequest<String> fromString() {
    return loadGeneric(String.class);
}
private <T> DrawableTypeRequest<T> loadGeneric(Class<T> modelClass) {
    //通过loaderFactory去找
    //拿到了FileDescriptorStringLoader
    ModelLoader<T, InputStream> streamModelLoader = Glide.buildStreamModelLoader(modelClass, context);
    //拿到了StreamStringLoader
    ModelLoader<T, ParcelFileDescriptor> fileDescriptorModelLoader =
            Glide.buildFileDescriptorModelLoader(modelClass, context);
    if (modelClass != null && streamModelLoader == null && fileDescriptorModelLoader == null) {
        throw new IllegalArgumentException("xxx");
    }

    //根据String.class和FileDescriptorStringLoader,了StreamStringLoader等构造DrawableTypeRequest
    return optionsApplier.apply(
            new DrawableTypeRequest<T>(modelClass, streamModelLoader, fileDescriptorModelLoader, context,
                    glide, requestTracker, lifecycle, optionsApplier));
}

针对下面这句代码,做如下分析

ModelLoader<T, InputStream> streamModelLoader = Glide.buildStreamModelLoader(modelClass, context);

首先modelClass是String.class

public static <T> ModelLoader<T, InputStream> buildStreamModelLoader(Class<T> modelClass, Context context) {
    return buildModelLoader(modelClass, InputStream.class, context);
}

所以传入和是String.class和InputStream.class

在这里插入图片描述

然后通过这两种类型去loader工厂中找。这个时候我们就要看我们当初注册的了。

在这里插入图片描述

public ModelLoader<String, InputStream> build(Context context, GenericLoaderFactory factories) {
    return new StreamStringLoader(factories.buildModelLoader(Uri.class, InputStream.class));
}

所以返回的是这样一个ModelLoader。

然后我们分析下一句:

传入的是String.class和

ModelLoader<T, ParcelFileDescriptor> fileDescriptorModelLoader =
        Glide.buildFileDescriptorModelLoader(modelClass, context);

在这里插入图片描述

在这里插入图片描述

所以还是老套路,通过String.class和ParcelFileDescriptor.class在列表中找。

在这里插入图片描述

在这里插入图片描述

看上面这一句。

先看DrawableTypeRequest的构造

参数列表:

  • String.class
  • StreamStringLoader
  • FileDescriptorStringLoader
  • context
  • glide
  • RequestTracker
  • Lifecycle
  • RequestManager.OptionsApplier
DrawableTypeRequest(Class<ModelType> modelClass, ModelLoader<ModelType, InputStream> streamModelLoader,
        ModelLoader<ModelType, ParcelFileDescriptor> fileDescriptorModelLoader, Context context, Glide glide,
        RequestTracker requestTracker, Lifecycle lifecycle, RequestManager.OptionsApplier optionsApplier) {
    super(context, modelClass,
            buildProvider(glide, streamModelLoader, fileDescriptorModelLoader, GifBitmapWrapper.class,
                    GlideDrawable.class, null),
            glide, requestTracker, lifecycle);
    this.streamModelLoader = streamModelLoader;
    this.fileDescriptorModelLoader = fileDescriptorModelLoader;
    this.optionsApplier = optionsApplier;
}

将这些大杂烩集中起来

在这里插入图片描述

DrawableTypeRequest 参数列表:

  • String.class
  • StreamStringLoader
  • FileDescriptorStringLoader
  • context
  • glide
  • RequestTracker
  • Lifecycle
  • RequestManager.OptionsApplier

DrawableRequestBuilder extends DrawableRequestBuilder

在这里插入图片描述

DrawableTypeRequest传入的参数

变量类型
TString.class
modelClassString.class
streamModelLoaderStreamStringLoader
fileDescriptorModelLoaderFileDescriptorStringLoader
contextContext
glideGlide
requestTrackerRequestTracker
lifecycleLifecycle
optionsApplierOptionsApplier

在这里插入图片描述

buildProvider(xxx)

在这里插入图片描述

所需参数

变量类型
glideGlide
streamModelLoaderStreamStringLoader
fileDescriptorModelLoaderFileDescriptorStringLoader
resourceClassGifBitmapWrapper.class
transcodedClassGlideDrawable.class
nullResourceTranscoder.class

然后看实现部分:

  1. transcoder==null,然后根据GifBitmapWrapper.class和GlideDrawable.class进行build出ResourceTranscoder
    在gilde的构造中:

在这里插入图片描述
所以第一步可以看出,得到的是

new GifBitmapWrapperDrawableTranscoder(new GlideBitmapDrawableTranscoder(context.getResources(), bitmapPool))
  1. 根据ImageVideoWrapper.class和GifBitmapWrapper.class进行build

在这里插入图片描述
同样在glide的构造中得到对应的注册表

在这里插入图片描述
所以这里得到的是:

new ImageVideoGifDrawableLoadProvider(imageVideoDataLoadProvider, gifDrawableLoadProvider, bitmapPool)
  1. 根据StreamStringLoader的对象和FileDescriptorStringLoader对象创建了一个ImageVideoModelLoader
ImageVideoModelLoader<A> modelLoader = new ImageVideoModelLoader<A>(streamModelLoader,fileDescriptorModelLoader);
  1. 生成一个FixedLoadProvider进行返回

其中FixedLoadProvider持有:

  • ImageVideoModelLoader modelLoader
  • GifBitmapWrapperDrawableTranscoder transcoder
  • ImageVideoGifDrawableLoadProvider dataLoadProvider
    在这里插入图片描述

然后这个时候回到DrawableTypeRequest中继续super方法进入DrawableRequestBuilder extends GenericRequestBuilder构造
在这里插入图片描述

在这里插入图片描述

参数传入的是

变量类型
modelClassString.class
contextContext
loadProviderLoadProvider<ModelType, ImageVideoWrapper, GifBitmapWrapper, GlideDrawable> loadProvider
glideGlide
requestTrackerRequestTracker
lifecycleLifecycle

继续GenericRequestBuilder构造

在这里插入图片描述

继承关系图如下:

image


into

由于执行load返回的是DrawableTypeRequest对象,所以在其中搜into方法
在这里插入图片描述

在这里插入图片描述

public Target<GlideDrawable> into(ImageView view) {
    return super.into(view);
}

在这里插入图片描述

注意transcodeClass是GlideDrawable.class

先进入:

glide.buildImageViewTarget(view, transcodeClass)

通过一个ImageView和GlideDrawable.classbuildTarget

private final ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory();
<R> Target<R> buildImageViewTarget(ImageView imageView, Class<R> transcodedClass) {
    return imageViewTargetFactory.buildTarget(imageView, transcodedClass);
}
public <Z> Target<Z> buildTarget(ImageView view, Class<Z> clazz) {
    if (GlideDrawable.class.isAssignableFrom(clazz)) {
        return (Target<Z>) new GlideDrawableImageViewTarget(view);
    } else if (Bitmap.class.equals(clazz)) {
        return (Target<Z>) new BitmapImageViewTarget(view);
    } else if (Drawable.class.isAssignableFrom(clazz)) {
        return (Target<Z>) new DrawableImageViewTarget(view);
    } else {
        throw new IllegalArgumentException("Unhandled class: " + clazz
                + ", try .as*(Class).transcode(ResourceTranscoder)");
    }
}

可见返回的是GlideDrawableImageViewTarget

然后进入into方法

GenericRequestBuilder.into()

//传入的是GlideDrawableImageViewTarget

public <Y extends Target<TranscodeType>> Y into(Y target) {
    Util.assertMainThread();
    if (target == null) {
        throw new IllegalArgumentException("You must pass in a non null Target");
    }
    if (!isModelSet) {
        throw new IllegalArgumentException("You must first set a model (try #load())");
    }

    Request previous = target.getRequest();

    if (previous != null) {
        previous.clear();
        requestTracker.removeRequest(previous);
        previous.recycle();
    }
    //核心在创造一个Request
    Request request = buildRequest(target);
    target.setRequest(request);
    lifecycle.addListener(target);
    //这一波说明RequestTracker添加了该请求&运行
    requestTracker.runRequest(request);

    return target;
}

核心就是构造一个请求,然后设置请求然后运行

target : GlideDrawableImageViewTarget

在buildRequest中最主要是执行了
在这里插入图片描述

当请求设置好之后就进行runRequest的操作了

public void runRequest(Request request) {
    requests.add(request);
    if (!isPaused) {
        request.begin();
    } else {
        //如果是暂停状态则放入稍后启动请求列表
        pendingRequests.add(request);
    }
}

GenericRequest.begin()

public void begin() {
    startTime = LogTime.getLogTime();
    if (model == null) {
        onException(null);
        return;
    }

    status = Status.WAITING_FOR_SIZE;
    if (Util.isValidDimensions(overrideWidth, overrideHeight)) {
        onSizeReady(overrideWidth, overrideHeight);//符合大小规范
    } else {
        target.getSize(this);
    }

    if (!isComplete() && !isFailed() && canNotifyStatusChanged()) {
        target.onLoadStarted(getPlaceholderDrawable());
    }
    if (Log.isLoggable(TAG, Log.VERBOSE)) {
        logV("finished run method in " + LogTime.getElapsedMillis(startTime));
    }
}

最后进入onSizeReady()

在这里插入图片描述

分析下里面的传参

header 1header 2
signatureEmptySignature
dataFetcherDataFetcher有若干中实现
ModelLoader<A, T> modelLoader = loadProvider.getModelLoader();
final DataFetcher<T> dataFetcher = modelLoader.getResourceFetcher(model, width, height);

在这里插入图片描述

所以在ImageVideoModelLoader中寻找

总之最后是HttpUrlFetcher对象

@Override
public DataFetcher<ImageVideoWrapper> getResourceFetcher(A model, int width, int height) {
    DataFetcher<InputStream> streamFetcher = null;
    if (streamLoader != null) {
        //StreamStringLoader
        streamFetcher = streamLoader.getResourceFetcher(model, width, height);
    }
    DataFetcher<ParcelFileDescriptor> fileDescriptorFetcher = null;
    if (fileDescriptorLoader != null) {
        //FileDescriptorStringLoader
        fileDescriptorFetcher = fileDescriptorLoader.getResourceFetcher(model, width, height);
    }

    if (streamFetcher != null || fileDescriptorFetcher != null) {
        return new ImageVideoFetcher(streamFetcher, fileDescriptorFetcher);
    } else {
        return null;
    }
}

针对streamFetcher = streamLoader.getResourceFetcher(model, width, height);

在这里插入图片描述

在这里插入图片描述

所以在glide的参数列表中找到image

在这里插入图片描述

在这里插入图片描述

所以走到load里面

在这里插入图片描述核心方法上图

其中最核心的是:

final A data = fetcher.loadData(priority);

真正的链接

在这里插入图片描述

所以A是个InputStream

所以后面就是根据流来获取一个Resource对象。

在这里插入图片描述

  1. 转换,转化长和宽等
  2. 写入缓存
  3. 是否将其编码成其他对象
    callback执行这里

在这里插入图片描述

找下target,知道当时是GlideDrawableImageViewTarget,所以走到如下

在这里插入图片描述
我们看到轮播gif,到这里super.onResourceReady(resource, animation);

在这里插入图片描述
最后执行
在这里插入图片描述

显示图片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值