glide

Glide.with(this).load(URL).into(imageView)

with流程

就是返回RequestManager

//Glide.java
private final RequestManagerRetriever requestManagerRetriever;
//此处有context、FragmentActivity、Fragment、View 的类似方法...
//with方法最终返回RequestManager对象
public static RequestManager with(@NonNull FragmentActivity activity) {
    return getRetriever(activity).get(activity);
}
private static RequestManagerRetriever getRetriever(@Nullable Context context) {
    ...
    //其中,Glide.get(context) 基于 DCL 单例
    return Glide.get(context).getRequestManagerRetriever();
}

public RequestManagerRetriever getRequestManagerRetriever() {
	return requestManagerRetriever;
}

RequestManagerRetriever.get(context)
//RequestManagerRetriever.java
//最终返回RequestManager对象。
//会根据传入context不同,分别调用不同的get方法。如果传入的是application,调用getApplicationManager方法。
public RequestManager get(@NonNull Context context) {
    if (context == null) {
        throw new IllegalArgumentException("You cannot start a load on a null Context");
    } else if (Util.isOnMainThread() && !(context instanceof Application)) {
        if (context instanceof FragmentActivity) {
            return get((FragmentActivity) context);
        } else if (context instanceof Activity) {
            return get((Activity) context);
        } else if (context instanceof ContextWrapper
                   && ((ContextWrapper) context).getBaseContext().getApplicationContext() != null) {
            return get(((ContextWrapper) context).getBaseContext());
        }
    }

    return getApplicationManager(context);
}

public RequestManager get(@NonNull FragmentActivity activity) {
    //如果不是主线程,就会调用application作用域的get方法
    if (Util.isOnBackgroundThread()) {
        return get(activity.getApplicationContext());
    } else {
        assertNotDestroyed(activity);
        //不同的参数,调用对应的方法获取FragmentManager传入supportFragmentGet方法中获取RequestManager。FragmentManager fm = fragment.getChildFragmentManager(); android.app.FragmentManager fm =activity.getFragmentManager(); 
        FragmentManager fm = activity.getSupportFragmentManager();
        return supportFragmentGet(activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
    }
}
//放回和RequestManagerRetriever绑定的RequestManager applicationManager
private volatile RequestManager applicationManager;
private RequestManager getApplicationManager(@NonNull Context context) {
	return applicationManager;
}

第一种是作用域Application,它的生命周期是全局 的,不搞空白Fragment就绑定Activity/Fragment
第二种是作用域非Application,它的生命周期是,专门搞空白Fragment就绑定 Activity/Fragment

//RequestManagerRetriever.java
// 用于【记录保存】FragmentManager SupportRequestManagerFragment 的映射关系
final Map<FragmentManager, SupportRequestManagerFragment> pendingSupportRequestManagerFragments = new HashMap<>();

private RequestManager supportFragmentGet(Context context,l FragmentManager fm,
    Fragment parentHint, boolean isParentVisible) {
    //从 map中获取 SupportRequestManagerFragment
    SupportRequestManagerFragment current =
        getSupportRequestManagerFragment(fm, parentHint, isParentVisible);
    //从该 Fragment 中获取 RequestManage
    RequestManager requestManager = current.getRequestManager();
    if (requestManager == null) {
        Glide glide = Glide.get(context);
        //实例化的requestManager,要传入fragment中的Lifecycle
        requestManager =factory.build(glide,current.getGlideLifecycle(),
                                      current.getRequestManagerTreeNode(), context);
        //将requestManager设置到fragment中
        current.setRequestManager(requestManager);
    }
    return requestManager;
}
//为了保证一个activity/fragment只创建一个空白的fragment,先通过FragmentManager获取fragment,如果失败,再通过map获取,如果再失败,才new一个fragment。最后发送一个handler是为了删除map中存的fragment
private SupportRequestManagerFragment getSupportRequestManagerFragment(
      @NonNull final FragmentManager fm, ...) {
    SupportRequestManagerFragment current =
        (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    if (current == null) {
      	current = pendingSupportRequestManagerFragments.get(fm);
     	 if (current == null) {
         	current = new SupportRequestManagerFragment();
        	current.setParentFragmentHint(parentHint);
             //如果父层可见,则调用 onStart() 生命周期
        	if (isParentVisible) {
          		current.getGlideLifecycle().onStart();
        	}
        	pendingSupportRequestManagerFragments.put(fm, current);
            fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
            handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();
          }
    }
    return current;
}
// SupportRequestManagerFragment.java
private final ActivityFragmentLifecycle lifecycle;
@Nullable private RequestManager requestManager;

public SupportRequestManagerFragment() {
	this(new ActivityFragmentLifecycle());
}

@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();
  }

ActivityFragmentLifecycle getGlideLifecycle() {
	return lifecycle;
}
//Lifecycle接口有两个实现类ActivityFragmentLifecycle和ApplicationLifecycle分别代表了两个作用域
//ActivityFragmentLifecycle.java
class ActivityFragmentLifecycle implements Lifecycle {
    //用集合Set<LifecycleListener>存储LifecycleListener,当生命周期发生变化,会遍历集合通知监听者,这些监听者就是RequestManager
  private final Set<LifecycleListener> lifecycleListeners =
      Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
 
  @Override
  public void addListener(@NonNull LifecycleListener listener) {
    lifecycleListeners.add(listener);

    if (isDestroyed) {
      listener.onDestroy();
    } else if (isStarted) {
      listener.onStart();
    } else {
      listener.onStop();
    }
  }

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

  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();
    }
  }


//RequestManager.java
//实例化 RequestManager 时需要一个 Lifecycle对象,这个对象是在无界面 Fragment 中创建的,当 Fragment 的生命周期变化时,就是通过这个Lifecycle 对象将事件分发到 RequestManager
//
public class RequestManager implements LifecycleListener, ... {
    final Lifecycle lifecycle;
    private final RequestTracker requestTracker;
    
    RequestManager(Glide glide, Lifecycle lifecycle, ...){
        ...
        this.lifecycle = lifecycle;
        //添加监听
        lifecycle.addListener(this);
    }
    @Override
    public synchronized void onDestroy() {
        ...
        //移除监听
        lifecycle.removeListener(this);
    }
    
   //重写LifecycleListener 暂停任务(页面不可见)
    public synchronized void onStop() {
        pauseRequests();
        targetTracker.onStop();
    }
  //重写LifecycleListener 恢复任务(页面可见)
    public synchronized void onStart() {
		resumeRequests();
        targetTracker.onStart();
    }
    //重写LifecycleListener 销毁任务(页面销毁)
    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);
    }
    public synchronized void pauseRequests() {
    	requestTracker.pauseRequests();
    }
    public synchronized void resumeRequests() {
    	requestTracker.resumeRequests();
    }
}



Glide.get(context)
//Glide.java
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 void checkAndInitializeGlide(@NonNull Context context) {
    ...
    //是否初始化标志
    isInitializing = true;
    //开始进行初始化
    initializeGlide(context);
    isInitializing = false;
}
private static void initializeGlide(@NonNull Context context)	{
    //实例化一个 GlideBuilder 传入
    initializeGlide(context, new GlideBuilder());
}

private static void initializeGlide(@NonNull Context context,@NonNull GlideBuilder builder){
    Context applicationContext =context.getApplicationContext();
    //这里拿到 @GlideModule 标识的注解处理器生成的GeneratedAppGlideModuleImpl、
    //GeneratedAppGlideModuleFactory ...等等。
    GeneratedAppGlideModule annotationGeneratedModule =getAnnotationGeneratedGlideModules();
    .....
    //通过注解生成的代码拿到 RequestManagerFactory
    RequestManagerFactory factory = annotationGeneratedModule!= null ?							annotationGeneratedModule.getRequestManagerFactory() : null;
    //将拿到的工厂添加到 GlideBuilder
    builder.setRequestManagerFactory(factory);
    ....
    //这里通过 Builder 建造者模式,构建出 Glide 实例对象
    Glide glide = builder.build(applicationContext);
    Iterator var13 = manifestModules.iterator();
    //开始注册组件回调
    while(var13.hasNext()) {
        GlideModule module = (GlideModule)var13.next();
        module.registerComponents(applicationContext, glide,
                                  glide.registry);
    }
    if (annotationGeneratedModule != null) {
        annotationGeneratedModule.registerComponents(applicationContext,
                                                     glide, glide.registry);
    }
    applicationContext.registerComponentCallbacks(glide);
    //将构建出来的 glide 赋值给 Glide 的静态变量
    Glide.glide = glide;
}

//Glide构造方法:将GlideBuilder中初始化的属性保存在自己的成员中;创建了ImageViewTargetFactory;创建了GlideContext (GlideContext extends ContextWrapper);

//GlideBuilder.java
public final class GlideBuilder {
    //管理线程池
    private Engine engine;
    //对象池(享元模式),这样做避免重复创建对象,对内存开销有一定效果
    private BitmapPool bitmapPool;
    private ArrayPool arrayPool;
    //GlideExecutor 线程池
    private GlideExecutor sourceExecutor;
    private GlideExecutor diskCacheExecutor;
    //本地磁盘缓存
    private DiskCache.Factory diskCacheFactory;
    //内存缓存
    private MemorySizeCalculator memorySizeCalculator;
    private MemoryCache memoryCache;
    private ConnectivityMonitorFactory connectivityMonitorFactory;
    private int logLevel = Log.INFO;
    private RequestOptions defaultRequestOptions = new RequestOptions();
    @Nullable
    private RequestManagerFactory requestManagerFactory;
    private GlideExecutor animationExecutor;
    private boolean isActiveResourceRetentionAllowed;
    @Nullable
    private List<RequestListener<Object>> defaultRequestListeners;
    private boolean isLoggingRequestOriginsEnabled;
    //都是一些配置信息,用到了 开闭原则。
    ....
        //开始构建,同学们注意:重点留意我写的注释
    @NonNull
    Glide build(@NonNull Context context) {
        //实例化一个网络请求的线程池
        if (sourceExecutor == null) {
            sourceExecutor = GlideExecutor.newSourceExecutor();
        }
        //实例化一个本地磁盘缓存的线程池
        if (diskCacheExecutor == null) {
            享学课堂diskCacheExecutor = GlideExecutor.newDiskCacheExecutor();
        }
        //实例化一个加载图片动画的一个线程池
        if (animationExecutor == null) {
            animationExecutor = GlideExecutor.newAnimationExecutor();
        }
        //实例化一个对图片加载到内存的一个计算
        if (memorySizeCalculator == null) {
            memorySizeCalculator = new
                MemorySizeCalculator.Builder(context).build();
        }
        //实例化一个默认网络连接监控的工厂
        if (connectivityMonitorFactory == null) {
            connectivityMonitorFactory = new
                DefaultConnectivityMonitorFactory();
        }
        //实例化一个 Bitmap 对象池
        if (bitmapPool == null) {
            int size = memorySizeCalculator.getBitmapPoolSize();
            //如果池子里还有可用的,直接加入 最近最少使用的 LruBitmap 容器里
            if (size > 0) {
                bitmapPool = new LruBitmapPool(size);
            } else {
                //如果池子已经满了,那么就装在 BitmapPoolAdapter
                bitmapPool = new BitmapPoolAdapter();
            }
        }
        //实例化一个数组对象池
        if (arrayPool == null) {
            arrayPool = new
                LruArrayPool(memorySizeCalculator.getArrayPoolSizeInBytes());
        }
        //资源内存缓存
        if (memoryCache == null) {
            memoryCache = new
                LruResourceCache(memorySizeCalculator.getMemoryCacheSize());
        }
        //磁盘缓存的工厂
        if (diskCacheFactory == null) {
            diskCacheFactory = new
                InternalCacheDiskCacheFactory(context);
        }
      
        //构建执行缓存策略跟线程池的引擎
        if (engine == null) {
            engine =
                new Engine(
                memoryCache,
                diskCacheFactory,
                diskCacheExecutor,
                sourceExecutor,
                GlideExecutor.newUnlimitedSourceExecutor(),
                GlideExecutor.newAnimationExecutor(),
                isActiveResourceRetentionAllowed);
        }
        if (defaultRequestListeners == null) {
            defaultRequestListeners = Collections.emptyList();
        } else {
            defaultRequestListeners =
                Collections.unmodifiableList(defaultRequestListeners);
        }
        //实例化一个 RequestManagerRetriever 请求管理类
        RequestManagerRetriever requestManagerRetriever =
            new RequestManagerRetriever(requestManagerFactory);
        //实例化 Glide 的地方
        return new Glide(
            context,
            engine,
            memoryCache,
            bitmapPool,
            arrayPool,
            requestManagerRetriever,
            connectivityMonitorFactory,
            logLevel,
            defaultRequestOptions.lock(),
            defaultTransitionOptions,
            defaultRequestListeners,
            isLoggingRequestOriginsEnabled);
    }
}

load流程

就是创建了RequestBuilder 对象

RequestBuilder : 这是一个通用请求构建类,可以处理通用资源类型的设置选项 和启动负载

//RequestManager.java
public RequestBuilder<Drawable> load(@Nullable String string) {
    return asDrawable().load(string);
}

public RequestBuilder<Drawable> load(@Nullable Uri uri) {
    return asDrawable().load(uri);
}

public RequestBuilder<Drawable> load(@Nullable File file) {
    return asDrawable().load(file);
}

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.java
// 描述加载的数据源-这里可以看做是我们刚刚传递进来的 http://xxxx.png
@Nullable private Object model;
// 描述这个请求是否已经添加了加载的数据源
private boolean isModelSet;

public RequestBuilder<TranscodeType> load(@Nullable String string) {
    return loadGeneric(string);
}

private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {
    this.model = model;
    isModelSet = true;
    return this;
}

into流程

//RequestBuilder.java
public ViewTarget<ImageView, TranscodeType> into(@NonNull ImageView view) {
    Util.assertMainThread();
    Preconditions.checkNotNull(view);
    // 根据 ImageView 布局中的 scaleType 来重构 requestOptions;如果在 xml ImageView 节点中 没有设置 scaleType 那么默认在构造函数中进行了初始化为 mScaleType = ScaleType.FIT_CENTER;  
    BaseRequestOptions<?> requestOptions = this;
    if (!requestOptions.isTransformationSet() && requestOptions.isTransformationAllowed()
        && view.getScaleType() != null) {
    
      switch (view.getScaleType()) {
       .....
        case FIT_CENTER:
        case FIT_START:
        case FIT_END:
          //这里用到了克隆(原型设计模式),选择一个 居中合适 的方案.
          requestOptions = requestOptions.clone().optionalFitCenter();
          break;
       ....
      }
    }
    //调用 into 重载函数,创建一个 ViewTarget
    return into(
        glideContext.buildImageViewTarget(view, transcodeClass),
        /*targetListener=*/ null,
        requestOptions,
        Executors.mainThreadExecutor());
}

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

//ImageViewTargetFactory.java
public <Z> ViewTarget<ImageView, Z> buildTarget(@NonNull ImageView view,
                                                @NonNull Class<Z> clazz) {
    //根据目标的编码类型不同 创建不同的的 ImageViewTarget
    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);
    } else {
        throw new IllegalArgumentException(
            "Unhandled class: " + clazz + ", try .as (Class).transcode(ResourceTranscoder)");
    }
}
//上面生产 Target 的时候只有调用了  `asBitmap` 才会执行生产 BitmapImageViewTarget ,所以这里我们关注 DrawableImageViewTarget;DrawableImageViewTarget 继承的是 ImageViewTarget 重写的 setResource 函数,实现了显示 Drawable 图片的逻辑,

//DrawableImageViewTarget.java
protected void setResource(@Nullable Drawable resource) {
    view.setImageDrawable(resource);
}

继续into重载

//RequestBuilder.java
private <Y extends Target<TranscodeType>> Y into(
    @NonNull Y target,
    @Nullable RequestListener<TranscodeType> targetListener,
    BaseRequestOptions<?> options,
    Executor callbackExecutor) {
    Preconditions.checkNotNull(target);
    //这里的 isModelSet 是在 load 的时候赋值为 true 的,所以不会抛异常
    if (!isModelSet) {
        throw new IllegalArgumentException("You must call #load() before calling #into()");
    }
    //为这个 http://xxx.png 生成一个 Glide request 请求
    //最后会调用到obtainRequest()方法返回SingleRequest.obtain(),最后就是new了一个SingleRequest
    Request request = buildRequest(target, targetListener, options, callbackExecutor);
    Request previous = target.getRequest();
    ...
    requestManager.clear(target);
    target.setRequest(request);
    //最后是调用 RequestManager 的 track 来执行目标的 Glide request 请求
    requestManager.track(target, request);
    return target;
}

//RequestManager.java
//这里对当前 class 加了一个同步锁避免线程引起的安全性  
synchronized void track(@NonNull Target<?> target, @NonNull Request request) {
    //添加一个目标任务  
    targetTracker.track(target);
    //执行 Glide request
    requestTracker.runRequest(request);
}

//RequestTracker.java
public void runRequest(@NonNull Request request) {
    //先为 `requests` 添加一个请求,看看是否是停止状态,如果不是就调用 `request.begin();`执行
    requests.add(request);
    if (!isPaused) {  
        request.begin();
    } else {
        request.clear();
        pendingRequests.add(request);
    }
}

//SingleRequest.java
public synchronized void begin() {
    assertNotCallingCallbacks();
    stateVerifier.throwIfRecycled();
    startTime = LogTime.getLogTime();
    if (model == null) {
        //检查外部调用的尺寸是否有效
        if (Util.isValidDimensions(overrideWidth, overrideHeight)) {
            width = overrideWidth;
            height = overrideHeight;
        }
        //失败的回调
        int logLevel = getFallbackDrawable() == null ? Log.WARN : Log.DEBUG;
        onLoadFailed(new GlideException("Received null model"), logLevel);
        return;
    }
    if (status == Status.RUNNING) {
        throw new IllegalArgumentException("Cannot restart a running request");
    }

    if (status == Status.COMPLETE) {
        //表示资源准备好了
        onResourceReady(resource, DataSource.MEMORY_CACHE);
        return;
    }


    status = Status.WAITING_FOR_SIZE;
    //这里表示大小已经准备好了
    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());
    }
    if (IS_VERBOSE_LOGGABLE) {
        logV("finished run method in " + LogTime.getElapsedMillis(startTime));
    }
}

…烂尾了

缓存机制

数据封装:key:根据图片地址,长宽等信息生成一个key,可以让磁盘缓存使用
value:对bitmap的封装

活动缓存:整显示在屏幕上的图片
内存缓存:Lru算法实现的缓存
磁盘缓存:DiskLruCache实现的缓存
网络本地:

活动缓存与内存缓存是互斥的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值