美文网首页
glide流程

glide流程

作者: 我妈叫我二乖 | 来源:发表于2018-11-09 14:26 被阅读8次

    Glide.with(this).load(url).into(imageView);

    with里面的参数:

       / * @see #with(android.app.Activity)
         * @see #with(android.app.Fragment)
         * @see #with(android.support.v4.app.Fragment)
         * @see #with(android.support.v4.app.FragmentActivity)
         * @see #with(android.app.Application)
         * @param context Any context, will not be retained.
         * @return A RequestManager for the top level application that can be used to start a load.
         */
        public static RequestManager with(Context context) {
            RequestManagerRetriever retriever = RequestManagerRetriever.get();
            return retriever.get(context);
        }
    
    

    为什么可以这么多的类型呢?glide是通过添加一个fragment到布局,这样就可以通过fragment的生命周期监听到页面的生命周期,随时随地的判断这个页面是否还存在,是否可以进行请求,是否还能进行展示!如果这个页面不存在,就会throw各种错误。比如:throw new IllegalArgumentException("You cannot start a load for a destroyed activity");
    throw new IllegalArgumentException("You cannot start a load on a fragment before it is attached");

     SupportRequestManagerFragment getSupportRequestManagerFragment(final FragmentManager fm) {
            SupportRequestManagerFragment current = (SupportRequestManagerFragment) fm.findFragmentByTag(
                FRAGMENT_TAG);
            if (current == null) {
                current = pendingSupportRequestManagerFragments.get(fm);
                if (current == null) {
                    current = new SupportRequestManagerFragment();
                    pendingSupportRequestManagerFragments.put(fm, current);
                    fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
                    handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();
                }
            }
            return current;
        }
    

    with方法结束返回一个requestManager。load方面里面可以传入String,ur以及本地的地址等等。

    public DrawableTypeRequest<String> load(String string) {
            return (DrawableTypeRequest<String>) fromString().load(string);
        }
    
    public DrawableTypeRequest<String> fromString() {
            return loadGeneric(String.class);
        }
    
    private <T> DrawableTypeRequest<T> loadGeneric(Class<T> modelClass) {
            ModelLoader<T, InputStream> streamModelLoader = Glide.buildStreamModelLoader(modelClass, context);
            ModelLoader<T, ParcelFileDescriptor> fileDescriptorModelLoader =
                    Glide.buildFileDescriptorModelLoader(modelClass, context);
            if (modelClass != null && streamModelLoader == null && fileDescriptorModelLoader == null) {
                throw new IllegalArgumentException("Unknown type " + modelClass + ". You must provide a Model of a type for"
                        + " which there is a registered ModelLoader, if you are using a custom model, you must first call"
                        + " Glide#register with a ModelLoaderFactory for your custom model class");
            }
    
            return optionsApplier.apply(
                    new DrawableTypeRequest<T>(modelClass, streamModelLoader, fileDescriptorModelLoader, context,
                            glide, requestTracker, lifecycle, optionsApplier));
        }
    

    load方法返回DrawableTypeRequest,进去看并没有into方法,找到父类DrawableRequestBuilder,几乎所有的方法实现都在这个类里面。找到info方法,看到是继承父类的方法,继续找到父类GenericRequestBuilder。

    @Override
        public Target<GlideDrawable> into(ImageView view) {
            return super.into(view);
        }
    
    public Target<TranscodeType> into(ImageView view) {
            Util.assertMainThread();
            if (view == null) {
                throw new IllegalArgumentException("You must pass in a non null View");
            }
    
            if (!isTransformationSet && view.getScaleType() != null) {
                switch (view.getScaleType()) {
                    case CENTER_CROP:
                        applyCenterCrop();
                        break;
                    case FIT_CENTER:
                    case FIT_START:
                    case FIT_END:
                        applyFitCenter();
                        break;
                    //$CASES-OMITTED$
                    default:
                        // Do nothing.
                }
            }
    
            return into(glide.buildImageViewTarget(view, transcodeClass));
        }
    

    相关文章

      网友评论

          本文标题:glide流程

          本文链接:https://www.haomeiwen.com/subject/mjutbftx.html