美文网首页
Glide-Android最常用的图片加载框架

Glide-Android最常用的图片加载框架

作者: 放羊娃华振 | 来源:发表于2020-12-09 17:41 被阅读0次

    一、概述

    Glide目前在Android的开发中非常的受欢迎,几乎是随便开一个项目都会想到使用glide当图片加载框架。有兴趣可以阅读下Glide源码。在附上Glide官方使用文档: https://muyangmin.github.io/glide-docs-cn/doc/options.html
    1.主要特点
    (1)支持Memory和Disk图片缓存。
    (2)支持gif和webp格式图片。
    (3)根据Activity/Fragment生命周期自动管理请求。
    (4)使用Bitmap Pool可以使Bitmap复用。
    (5)对于回收的Bitmap会主动调用recycle,减小系统回收压力。

    二、引用

    1.高版本

      implementation 'com.github.bumptech.glide:glide:4.11.0'
      annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    

    2.低版本

    implementation 'com.github.bumptech.glide:glide:3.7.0'
    

    三、使用

    1.简单使用
    Glide
        .with(context)
        .load(url)
        .centerCrop()
        .placeholder(R.drawable.loading_spinner)
        .into(myImageView);
    
    2.加载bitmap
     Glide.with(this).load(path).asBitmap().into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
    
                    ivPic.setImageBitmap(resource);
                }
            });
    
    3.加载Drawable
     Glide.with(this).load(path).into(new Target<GlideDrawable>(){
    
                @Override
                public void onStart() {
    
                }
    
                @Override
                public void onStop() {
    
                }
    
                @Override
                public void onDestroy() {
    
                }
    
                @Override
                public void onLoadStarted(Drawable placeholder) {
    
                }
    
                @Override
                public void onLoadFailed(Exception e, Drawable errorDrawable) {
    
                }
    
                @Override
                public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                    //Drawable进行转换
                }
    
                @Override
                public void onLoadCleared(Drawable placeholder) {
    
                }
    
                @Override
                public void getSize(SizeReadyCallback cb) {
    
                }
    
                @Override
                public void setRequest(Request request) {
    
                }
    
                @Override
                public Request getRequest() {
                    return null;
                }
            });
    
    4.Glide配置(这个配置要生效的话,不通版本的配置不一样,有的是加注解,有的需要在清单文件里面配置)
    public class GlideModelConfig implements GlideModule {
    
        int diskSize = 1024 * 1024 * 100;
        int memorySize = (int) (Runtime.getRuntime().maxMemory()) / 8;  // 取1/8最大内存作为最大缓存
    
        @Override
        public void applyOptions(Context context, GlideBuilder builder) {
            // 定义缓存大小和位置
            builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskSize));  //内存中
            builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "cache", diskSize)); //sd卡中
    
            // 默认内存和图片池大小
            MemorySizeCalculator calculator = new MemorySizeCalculator(context);
            int defaultMemoryCacheSize = calculator.getMemoryCacheSize(); // 默认内存大小
            int defaultBitmapPoolSize = calculator.getBitmapPoolSize(); // 默认图片池大小
            builder.setMemoryCache(new LruResourceCache(defaultMemoryCacheSize)); // 该两句无需设置,是默认的
            builder.setBitmapPool(new LruBitmapPool(defaultBitmapPoolSize));
    
            // 自定义内存和图片池大小
            builder.setMemoryCache(new LruResourceCache(memorySize));
            builder.setBitmapPool(new LruBitmapPool(memorySize));
    
            // 定义图片格式
            builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
            builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565); // 默认
        }
    
        @Override
        public void registerComponents(Context context, Glide glide) {
        }
    }
    

    四、源码分析

    网络下载图片:HttpUrlFetcher
    加载asset:AssetPathFetcher
    Glide是个单例,使用双重校验(com.bumptech.glide.Glide)。

     /**
         * Get the singleton.
         *
         * @return the singleton
         */
        public static Glide get(Context context) {
            if (glide == null) {
                synchronized (Glide.class) {
                    if (glide == null) {
                        Context applicationContext = context.getApplicationContext();
                        List<GlideModule> modules = new ManifestParser(applicationContext).parse();
    
                        GlideBuilder builder = new GlideBuilder(applicationContext);
                        for (GlideModule module : modules) {
                            module.applyOptions(applicationContext, builder);
                        }
                        glide = builder.createGlide();
                        for (GlideModule module : modules) {
                            module.registerComponents(applicationContext, glide);
                        }
                    }
                }
            }
    
            return glide;
        }
    

    相关文章

      网友评论

          本文标题:Glide-Android最常用的图片加载框架

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