android 图片 LRUCache 原理 Glide 源码解析(下)

tech2022-09-24  107

RequestManagerRetriever

RequestManager

   FragmentManager fm = activity.getSupportFragmentManager();

  FragmentManager fm = fragment.getChildFragmentManager();

fm.beginTransaction.add()

  ModelLoader<T, InputStream> streamModelLoader = Glide.buildStreamModelLoader(modelClass, context);         ModelLoader<T, ParcelFileDescriptor> fileDescriptorModelLoader =                 Glide.buildFileDescriptorModelLoader(modelClass, context);                                ModelLoader<Model = URL ,Data >         

ModelLoader<T,InputStream>        ParcelFileDescriptor buildStreamModelLoader            buildFileDescriptorModelLoader

placeholder error diskCacheStrategy    override

DrawableTypeRequest

into

 return into(glide.buildImageViewTarget(view, transcodeClass));

<R> Target<R> buildImageViewTarget(ImageView imageView, Class<R> transcodedClass) {     return imageViewTargetFactory.buildTarget(imageView, transcodedClass); }

BitmapImageViewTarget

GlideDrawableImageViewTarget

  Request request = buildRequest(target);     target.setRequest(request);

obtainRequest

buildRequestRecursive

GenericRequest obtain

placeholderId、errorPlaceholder、diskCacheStrategy

ModelLoader<Model = URL ,Data >

@Override 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  overrideWidth overrideHeight

 private final ModelLoader<ModelType, InputStream> streamModelLoader;     private final ModelLoader<ModelType, ParcelFileDescriptor> fileDescriptorModelLoader;     private final RequestManager.OptionsApplier optionsApplier;

ModelLoader<ModelType,InputStream> streamDecoder ParcelFileDescriptor

buildProvider(glide, streamModelLoader, fileDescriptorModelLoader, GifBitmapWrapper.class,                         GlideDrawable.class, null),                 glide, requestTracker, lifecycle);

public interface ModelLoader<T, Y> {

 DataFetcher<Y> getResourceFetcher(T model, int width, int height);

    DataFetcher<InputStream> streamFetcher = null;         if (streamLoader != null) {             streamFetcher = streamLoader.getResourceFetcher(model, width, height);         }         DataFetcher<ParcelFileDescriptor> fileDescriptorFetcher = null;         if (fileDescriptorLoader != null) {             fileDescriptorFetcher = fileDescriptorLoader.getResourceFetcher(model, width, height);         }

                      DataFetcher<InputStream>         streamLoader.getResourceFetcher

             public class HttpUrlFetcher implements DataFetcher<InputStream> {

HttpUrlFetcher

  loadStatus = engine.load(signature, width, height, dataFetcher, loadProvider, transformation, transcoder,                 priority, isMemoryCacheable, diskCacheStrategy, this);

DiskCacheStrategy diskCacheStrategy ResourceCallback cb

 EngineResource<?> cached = loadFromCache(key, isMemoryCacheable)

   cb.onResourceReady(cached);

 EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);         if (active != null) {

  cb.onResourceReady(active);

        EngineJob current = jobs.get(key);         if (current != null) {             current.addCallback(cb);

     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);         EngineRunnable runnable = new EngineRunnable(engineJob, decodeJob, priority);         jobs.put(key, engineJob);         engineJob.addCallback(cb);         engineJob.start(runnable);

         final EngineResource result;

    private final MemoryCache cache;     private final EngineJobFactory engineJobFactory;     private final Map<Key, WeakReference<EngineResource<?>>> activeResources;

    WeakReference<EngineResource<?>> act      iveResources;

    MemoryCache cache;                   private final Map<Key, EngineJob> jobs;         Key ,EngineJob jobs;                     private final ExecutorService diskCacheService;         private final ExecutorService sourceService;                  ExecutorService diskCacheService         sourceService                                     private Set<ResourceCallback> ignoredCallbacks;     private EngineRunnable engineRunnable;     private EngineResource<?> engineResource;                    DecodeJob     decodeFromSource          decodeSource                   final A data = fetcher.loadData(priority);                           public ImageVideoWrapper loadData(Priority priority) throws Exception {                                     InputStream   is = streamFetcher.loadData(priority);             HttpUrlFetcher = streamFetcher                                              fileDescriptor = fileDescriptorFetcher.loadData(priority);                                return loadDataWithRedirects(glideUrl.toURL(), 0 /*redirects*/, null /*lastUrl*/, glideUrl.getHeaders());                            ResourceDecoder  resourceDecoder                                Resource<Z> decode(T source, int width, int height) throws IOException;                           public class GifBitmapWrapperStreamResourceDecoder implements ResourceDecoder<InputStream, GifBitmapWrapper> {                  public GifBitmapWrapper(Resource<Bitmap> bitmapResource, Resource<GifDrawable> gifResource) {                  GifBitmapWrapperStreamResourceDecoder              ResourceDecoder     GifBitmapWrapper                                    就调用decodeGifWrapper()方法来进行解码,如果是普通的静图就用调用decodeBitmapWrapper()方法来进行解码                  public class ImageVideoBitmapDecoder implements ResourceDecoder<ImageVideoWrapper, Bitmap> {                           public class BitmapResource implements Resource<Bitmap> {                  BitmapResource                  public class StreamBitmapDecoder implements ResourceDecoder<InputStream, Bitmap> {                      public Resource<GlideDrawable> transcode(Resource<GifBitmapWrapper> toTranscode) {              Resource<Bitmap> bitmapResource =     gifBitmap.getBitmapResource                     @Override     public Resource<GlideBitmapDrawable> transcode(Resource<Bitmap> toTranscode) {         GlideBitmapDrawable drawable = new GlideBitmapDrawable(resources, toTranscode.get());         return new GlideBitmapDrawableResource(drawable, bitmapPool);     }

GlideBitmapDrawable          Resource<Bitmap> toTranscode

GlideBitmapDrawable           

Resource<GlideDrawable>

      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);         EngineRunnable runnable = new EngineRunnable(engineJob, decodeJob, priority);         jobs.put(key, engineJob);         engineJob.addCallback(cb);         engineJob.start(runnable);                           EngineJob    engineJobFactory.build                          DecodeJob         decodeJob   =        

最新回复(0)