Glide源码分析(一):大致调用的原理

简介:1,环境是基于glide3.7源码分析

           2,这篇主要讲解glide的大致调用原理

先说glide加载原理:三级缓存:优先级 内存,本地文件,网络

    glide简单的调用 Glide.with(this).load(imageurl).into(imageview);

先看看into的源码,最终调用是在GenericRequestBuilder类中的 以下方法

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 = buildRequest(target);//创建一个请求GenericRequest
    target.setRequest(request);
    lifecycle.addListener(target);
    requestTracker.runRequest(request);//开始请求

    return target;
}

然后看下buildRequest的源码

private Request buildRequestRecursive(Target<TranscodeType> target, ThumbnailRequestCoordinator parentCoordinator) {
        if (thumbnailRequestBuilder != null) {
           ....
            return coordinator;
        } else if (thumbSizeMultiplier != null) {
            // Base case: thumbnail multiplier generates a thumbnail request, but cannot recurse.
            ...
            return coordinator;
        } else {
            // Base case: no thumbnail.
            正常走这里的代码 这里返回的是GenericRequest
            return obtainRequest(target, sizeMultiplier, priority, parentCoordinator);

        }

看下requestTracker.runRequest(request);中的具体实现

public void runRequest(Request request) {
        requests.add(request);
        if (!isPaused) {
            //正常是走这里 调用的是GenericRequest的begin
            request.begin();

        } else {
            pendingRequests.add(request);
        }
    }
    
    查看GenericRequest 中的begin()
    

public void begin() {
       ....

        status = Status.WAITING_FOR_SIZE;
        if (Util.isValidDimensions(overrideWidth, overrideHeight)) {
            onSizeReady(overrideWidth, overrideHeight);
        } else {

           //我们没有设置宽和高,走的是这里面
            target.getSize(this);//这里调用的GlideDrawableImageViewTarget的getSize方法具体调用的是ViewTarget的getSize()方法

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

查看ViewTarget的getSize()的方法调用的是ViewTarget.SizeDeterminer中的getsize()方法

public void getSize(SizeReadyCallback cb) {
            int currentWidth = getViewWidthOrParam();
            int currentHeight = getViewHeightOrParam();
            if (isSizeValid(currentWidth) && isSizeValid(currentHeight)) {
                //走这里的逻辑 回调的是GenericRequest中的onSizeReady
                cb.onSizeReady(currentWidth, currentHeight);

            } else {
                // We want to notify callbacks in the order they were added and we only expect one or two callbacks to
                // be added a time, so a List is a reasonable choice.
                if (!cbs.contains(cb)) {
                    cbs.add(cb);
                }
                if (layoutListener == null) {
                    final ViewTreeObserver observer = view.getViewTreeObserver();
                    layoutListener = new SizeDeterminerLayoutListener(this);
                    observer.addOnPreDrawListener(layoutListener);
                }
            }
        }

查看GenericRequest中的onSizeReady()

@Override
    public void onSizeReady(int width, int height) {
    
    ....
    ModelLoader<A, T> modelLoader = loadProvider.getModelLoader();
    final DataFetcher<T> dataFetcher = modelLoader.getResourceFetcher(model, width, height);

    if (dataFetcher == null) {
        onException(new Exception("Failed to load model: \'" + model + "\'"));
        return;
    }
    ResourceTranscoder<Z, R> transcoder = loadProvider.getTranscoder();
    if (Log.isLoggable(TAG, Log.VERBOSE)) {
        logV("finished setup for calling load in " + LogTime.getElapsedMillis(startTime));
    }
    loadedFromMemoryCache = true;

     //从内存加载图片  通过Engine 的load 方法
    loadStatus = engine.load(signature, width, height, dataFetcher, loadProvider, transformation, transcoder,
            priority, isMemoryCacheable, diskCacheStrategy, this);
    loadedFromMemoryCache = resource != null;

    if (Log.isLoggable(TAG, Log.VERBOSE)) {
        logV("finished onSizeReady in " + LogTime.getElapsedMillis(startTime));
    }
    } 

查看Engine 的load 方法

 public <T, Z, R> LoadStatus load(Key signature, int width, int height, DataFetcher<T> fetcher,
            DataLoadProvider<T, Z> loadProvider, Transformation<Z> transformation, ResourceTranscoder<Z, R> transcoder,
            Priority priority, boolean isMemoryCacheable, DiskCacheStrategy diskCacheStrategy, ResourceCallback cb) {
        
        ......
        //从内存缓存加载
        EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);

        if (cached != null) {
            cb.onResourceReady(cached);
            if (Log.isLoggable(TAG, Log.VERBOSE)) {
                logWithTimeAndKey("Loaded resource from cache", startTime, key);
            }
            return null;
        }
        //从正在使用的内存缓存中加载
        EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);

        if (active != null) {
            cb.onResourceReady(active);
            if (Log.isLoggable(TAG, Log.VERBOSE)) {
                logWithTimeAndKey("Loaded resource from active resources", startTime, key);
            }
            return null;
        }

        EngineJob current = jobs.get(key);
        if (current != null) {
            current.addCallback(cb);
            if (Log.isLoggable(TAG, Log.VERBOSE)) {
                logWithTimeAndKey("Added to existing load", startTime, key);
            }
            return new LoadStatus(cb, current);
        }

        EngineJob engineJob = engineJobFactory.build(key, isMemoryCacheable);
        DecodeJob<T, Z, R> decodeJob = new DecodeJob<T, Z, R>(key, width, height, fetcher, loadProvider, transformation,
                transcoder, diskCacheProvider, diskCacheStrategy, priority);
                
        //执行runnable 中的run方法去联网加载数据以及本地文件加载数据
        EngineRunnable runnable = new EngineRunnable(engineJob, decodeJob, priority);

        jobs.put(key, engineJob);
        engineJob.addCallback(cb);
        engineJob.start(runnable);

        if (Log.isLoggable(TAG, Log.VERBOSE)) {
            logWithTimeAndKey("Started new load", startTime, key);
        }
        return new LoadStatus(cb, engineJob);
    }

   接下来查看EngineRunnable 中的run方法 

public void run() {
        if (isCancelled) {
            return;
        }

        Exception exception = null;
        Resource<?> resource = null;
        try {
            //这里是加载数据的代码 从文件或网络查看
            resource = decode();

        } catch (Exception e) {
            if (Log.isLoggable(TAG, Log.VERBOSE)) {
                Log.v(TAG, "Exception decoding", e);
            }
            exception = e;
        }

        if (isCancelled) {
            if (resource != null) {
                resource.recycle();
            }
            return;
        }
        //这里是回调的处理
        if (resource == null) {
            onLoadFailed(exception);
        } else {
            onLoadComplete(resource);
        }

    }

   查看EngineRunnable中中decode()方法

private Resource<?> decode() throws Exception {
    if (isDecodingFromCache()) {
        //这里是从文件加载资源
        return decodeFromCache();
    } else {
        //这里是从网络加载资源
        return decodeFromSource();
    }
}

大致的调用是这样的        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值