为了账号安全,请及时绑定邮箱和手机立即绑定

项目中如何快速将Glide3替换成Glide4

标签:
Android

我想大多数人在自己的项目中还是使用Glide3.7.1这个版本吧!不过Glide版本现在已经到4.4.0了!

当我们把Glide3更换成Glide4,会发现大部分地方都报错了,那么该怎样快速替换Glide3为Glide4呢?

下面我们一起来看看怎样实现Glide3到Glide4的快速替换。

Glide4的基本用法:
  • 引入Glide
      implementation 'com.github.bumptech.glide:glide:4.4.0'
      annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'

compiler:包含各种注解的使用,Glide3快速替换成Glide4时要用到。

  • 添加网络权限
       <uses-permission android:name="android.permission.INTERNET" />

在这个地方可能你的项目会报个错:java.lang.NoSuchMethodError

这是因为Glide4中已经引入了appcompat-v7包,版本不一致引起。

解决方法:

Glide4.4.0引入的是27.0.2版本,所以把你项目中的appcompat-v7更换为:

     implementation 'com.android.support:appcompat-v7:27.0.2'

详细请看:Glide4.4.0报java.lang.NoSuchMethodError


  • 普通加载图片
        Glide.with(this.getApplicationContext())
                        .load(url)
                        .into(mImage);
  • 占位图和错误时显示图片
        RequestOptions options = new RequestOptions();
                options.placeholder(R.drawable.ic_launcher_background);
                options.error(R.mipmap.load_error);
                //禁用掉Glide的缓存功能
                options.diskCacheStrategy(DiskCacheStrategy.NONE);
                Glide.with(this.getApplicationContext())
                        .load(url)
                        .apply(options)
                        .into(mImage);

这里就是Glide4和Glide3的最大不同,他将部分API功能封装在RequestOptions 中,在通过apply方法,传递给Glide使用,这样我们就可以很方便的在需要的地方可以进行不同的配置了,不用像Glide3一样传递很多参数!

  • 指定图片大小
        RequestOptions options1 = new RequestOptions();
                //指定大小为200*100
                //options1.override(200, 100);
                //加载一张图片的原始尺寸的图片
                options1.override(Target.SIZE_ORIGINAL);
                Glide.with(this.getApplicationContext())
                        .load(url)
                        //请求给定系数的缩略图。如果缩略图比全尺寸图先加载完,
                        // 就显示缩略图,否则就不显示。
                        // 系数sizeMultiplier必须在(0,1)之间,
                        // 可以递归调用该方法。
                        .thumbnail(0.1f)
                        .apply(options1)
                        .into(mImage);
  • 禁用内存缓存&硬盘缓存功能
                // DiskCacheStrategy.NONE: 表示不缓存任何内容。
                // DiskCacheStrategy.DATA: 表示只缓存原始图片。
                // DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。
                // DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
                // DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。
                RequestOptions options2 = new RequestOptions()
                        //禁用内存缓存
                        .skipMemoryCache(true)
                        //硬盘缓存功能
                        .diskCacheStrategy(DiskCacheStrategy.NONE);
                Glide.with(this.getApplicationContext())
                        .load(url)
                        .apply(options2)
                        .into(mImage);
  • 指定加载格式GIF
Glide.with(this.getApplicationContext())
                        .load("file:///android_asset/jdfw.gif")
                        .into(mImage);
  • 获取gif第一帧
                 /**
                 * 注意:在Glide 3中的语法是先load()再asBitmap()的,
                 *
                 * 而在Glide 4中是先asBitmap()再load()的
                 *
                 * 如果写错了顺序就肯定会报错了
                 */
                Glide.with(this.getApplicationContext())
                        //.asBitmap()//强制指定加载静态图片
                        //.asGif()//强制指定加载动态图片
                        //.asFile()//强制指定文件格式的加载
                        .asDrawable()//强制指定Drawable格式的加载
                        .load("file:///android_asset/jdfw.gif")
                        .into(mImage);
  • 回调与监听
/**
     * 回调与监听
     */
    SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
        @Override
        public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
            mImage.setImageDrawable(resource);
        }
    };
    Glide.with(this.getApplicationContext())
                        .load(url)
                        .into(simpleTarget);
  • 预加载后显示
        预加载

       Glide.with(this)
                        .load("https://unsplash.it/200/200?random&22")
                        .preload();
        预加载后显示

         Glide.with(this.getApplicationContext())
                        .load("https://unsplash.it/200/200?random&22")
                        .into(mImage);
  • submit()方法:类似Glide3中的downloadOnly
     new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            final Context context = getApplicationContext();
                            FutureTarget<File> target = Glide.with(context)
                                    //.asDrawable()
                                    .asFile()
                                    .load(url)
                                    .submit();
                            //final Drawable drawable = target.get();
                            final File imageFile = target.get();
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    mTextview.setText(imageFile.getPath());
                                }
                            });
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
  • listener()方法
         Glide.with(this.getApplicationContext())
                        .load(url)
                        .listener(new RequestListener<Drawable>() {
                            @Override
                            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                                mTextview.setText("加载失败");
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                                mTextview.setText("加载成功");
                                return false;
                            }
                        })
                        .into(mImage);
  • 图片变换(圆角等)
        RequestOptions options3 = new RequestOptions();
                //options3.centerCrop();
                // options3.fitCenter();
                options3.circleCrop();
                Glide.with(this.getApplicationContext())
                        .load("https://unsplash.it/200/200?random&55")
                        .apply(options3)
                        .into(mImage);

自定义模块

在Glide3中定义了自定义模块之后,还必须在AndroidManifest.xml文件中去注册它才能生效,而在Glide 4中是不需要的,因为@GlideModule这个注解已经能够让Glide识别到这个自定义模块了(记得Build -> Rebuild Project)!

package tsou.com.simple.glide4test.glidemodule;

import android.content.Context;

import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;
import com.bumptech.glide.module.AppGlideModule;

/**
 * Created by Administrator on 2017/12/22 0022.
 * 在Glide3中需要在AndroidManifest.xml中配置
 * <p>
 * Glide4,只要有@GlideModule注解就好
 */
@GlideModule
public class MyAppGlideModule extends AppGlideModule {

    public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024;
    public static final String DISK_CACHE_NAME = "huangxiaoguo";

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        super.applyOptions(context, builder);
        /**
         将所有Glide加载的图片缓存到SD卡上,
         默认硬盘缓存大小都是250M,这里改为500
         * */
        //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));

        /**
         ExternalCacheDiskCacheFactory的默认缓存路径
         是在sdcard/Android/data/包名/cache/image_manager_disk_cache目录当中
         */
        //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));

        /**
         * 更改缓存最总文件夹名称
         *
         * 是在sdcard/Android/data/包名/cache/DISK_CACHE_NAME目录当中
         */
        //此方法在Glide4已过时
        // builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));
        builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));
        /**
         * Glide也能使用ARGB_8888的图片格式
         * 虽然图片质量变好了,但同时内存开销也会明显增大
         */
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide, Registry registry) {
        super.registerComponents(context, glide, registry);
    }
}
  • 默认缓存路径

图片描述

  • 设置缓存路径为SD卡

图片描述

Glide3替换成Glide4(Generated API)

在自定义模块完成以后,就可以使用Glide的模式啦!请看:

                //使用Generated API(类似Glide3用法)
                //使用GlideApp,首先确保你的代码中有一个自定义的模块,
                // 并且给它加上了@GlideModule注解,也就是自定义模块
                GlideApp.with(this.getApplicationContext())
                        .load(url)
                        .placeholder(R.drawable.ic_launcher_background)
                        .error(R.mipmap.load_error)
                        .skipMemoryCache(true)//清除缓存
                        .diskCacheStrategy(DiskCacheStrategy.NONE)//表示既缓存原始图片,也缓存转换过后的图片
                        .override(Target.SIZE_ORIGINAL)
                        .circleCrop()//切圆
                        .into(mImage);

把之前Glide替换成GlideApp,就可以使用Glide3的方式进行使用了!是不是很方便!

定制自己的API

定制自己的API需要借助@GlideExtension和@GlideOption这两个注解。创建一个我们自定义的扩展类

package tsou.com.simple.glide4test.glidemodule;

import com.bumptech.glide.annotation.GlideExtension;
import com.bumptech.glide.annotation.GlideOption;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;

import tsou.com.simple.glide4test.R;

/**
 * Created by Administrator on 2017/12/25 0025.
 */
@GlideExtension
public class MyGlideExtension {
    /**
     * 将这个类的构造函数声明成private,这是必须要求的写法
     */
    private MyGlideExtension() {
    }

    @GlideOption
    public static void myGlideConfiguration(RequestOptions options) {
        //占位图
        options.placeholder(R.drawable.ic_launcher_background);
        //错误图片
        options.error(R.mipmap.load_error);
        //表示只缓存原始图片
        options.diskCacheStrategy(DiskCacheStrategy.DATA);
        //切圆
        options.circleCrop();
        //...等等所有的属性
    }
}

使用自定义API方式

          GlideApp.with(this.getApplicationContext())
                        .load(url)
                        .myGlideConfiguration()//自定义API
                        .into(mImage);

这样,我们就可以直接使用自己的API了,同时所有的Glide配置都在MyGlideExtension 进行配置,方便项目中的同意修改!

到此Glide4的基本使用到此结束,希望对你有所帮助!
同时欢迎大家的指教,谢谢!

Demo地址:http://download.csdn.net/download/huangxiaoguo1/10172358

Glide4的使用方式虽然和Glide3不同,但是主要的功能却和Glide3一样,其他关于Glide4的功能在这里没有详细给出,需要了解,请看:

整理Glide方法使用含义(毛玻璃效果,实现圆角等)

Glide使用高级技巧(解决Glide生成缓存Key问题)

Android图片加载框架:玩转Glide的回调与监听

android自定义Glide图片加载(以更改Glide缓存路径和使用ARGB_8888的图片格式为例)

android替换Glide通讯组件为Okhttp并监控加载进度

点击查看更多内容
4人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消