【框架】Glide图片加载框架

本文介绍了Android开发中如何使用Glide图片加载框架加载本地、网络资源,并探讨了网络图片加载的内存优化技巧。讲解了如何通过@GlideExtension扩展和封装配置选项,以及在不同Android版本中的网络访问策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景知识介绍

    Android软件中可能需要加载图片按照来源可以分为3种:

  • 资源文件中的图片
  • 手机中的图片
  • 网络中的图片

    加载图片的步骤可以分为3步:找到图片地址、将图片转换为可被加载的对象、通过图片加载控件展示图片。

    如果使用Android原生的方法,加载一个网络图片的大致过程为:网络请求图片、读取返回的输入流、将返回的输入流转为Bitmap、切到UI线程将Bitmap显示在控件上。当请求的图片过大时,直接将返回的输入流转为Bitmap可能造成OOM,需要对这种情况进行更复杂的处理。

    在这样的需求背景下,出现了许多图片加载框架,而Glide是Google推荐的图片加载框架。

二、使用方法

添加依赖如下,第一个为Glide库,第二个为Generated API的库:

   dependencies {
     implementation 'com.github.bumptech.glide:glide:4.11.0'
     annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
   }

主要使用的方法如下:

  • .with()    创建图片加载实例
  • .load()    指定加载的图片资源
  • .into()    指定图片的加载控件

//TODO Glide常用方法补充。

代码示例:

private void glideLoadImage(Context context, ImageView imageView, String imageUrl) {
    Glide.with(context)    //传入上下文。
        .load(imageUrl)    //传入图片的URL,load()方法可以传入的参数类型非常多,能想到的都行。
        .into(imageView);  //指定将图片加载到什么空间。
}

通过使用RequestOptions可以对加载实例进行配置,调用apply()方法为Glide设置自定义配置:

private void glideLoadImage(Context context, ImageView imageView, String imageUrl) {
    //配置Glide
    RequestOptions options = new RequestOptions()    
        .placeholder(R.mipmap.loading)    //指定加载过程中显示的图片。
        .error(R.mipmap.load_error)       //指定加载失败时显示的图片。
        .circleCrop();                    //指定图片为圆角。

    Glide.with(context)    //传入上下文。
        .load(imageUrl)    //传入图片的URL,load()方法可以传入的参数类型非常多,能想到的都行。
        .into(imageView);  //指定将图片加载到什么空间。
}

在开发过程中,可能会使用到各种各样的RequestOptions,如果每次加载时都生成一边配置项,则非常不方便,通常有两种解决方案:

方案一:将各种配置项封装到一个工具类中,通过静态方法来获取。如:

public class ClideOptionsUtils {

    public static RequestOptions baseOptions() {
        return new RequestOptions()
            .placeholder(R.mipmap.loading)
            .error(R.mipmap.error);
    }

    public static RequestOptions circleCropOptions() {
        return baseOptions().circleCrop();
    }
}

方案二:使用Generated API扩展(重点)。

    使用流程:

  • 引入Generated API的支持库。
  • 创建类,继承AppGlideModule并添加@GlideModule注解。
  • 创建类,添加@GlideExtension注解,并实现private构造函数。

代码实例如下:

    1、引入Generated API的支持库。即:

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

     2、创建类,继承AppGlideModule并添加@GlideModule注解。

/**
 * 生成GlideApp对象
 */
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
}

    3、 创建类,添加@GlideExtension注解,并实现private构造函数。在这个类中可以定义由注解@GlideOption修饰的static方法,方法的参数及返回值类型都是BaseRequestOptions<?>,这些方法用于封装不同的配置参数。

@GlideExtension
public class MyGlideExtension {
    private MyGlideExtension() {}

    @GlideOption
    public static BaseRequestOptions<?> testOptionsA(BaseRequestOptions<?> options) {
        return options.placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_search)
                .circleCrop();
    }

    @GlideOption
    public static BaseRequestOptions<?> testOptionsB(BaseRequestOptions<?> options) {
        return options.placeholder(R.mipmap.ic_launcher)
                .optionalCenterInside()
                .error(R.mipmap.ic_search);
    }
}

    4、使用GlideApp.with()而不是Glide.with()来创建加载实例,调用上一步中封装配置参数的方法来应用相应的参数。注意这里调用配置参数的方法时不需要传入参数,Glide在反射调用我们定义的方法时会自动为我们传入参数。GlideApp和上一步中定义的@GlideOption修饰的方法编译器也可能无法找到,同步并Rebuild工程即可。

    private void glideAppLoadUrlImage() {
        GlideApp.with(GlideTestActivity.this)
                .load(R.mipmap.ic_kill)
                .testOptionsB()    //注意这里不用加参数,Glide会在反射时自动为我们添加参数。
                .into(imageView);
    }

三、开发中遇到的坑记录

1、Android9.0以上访问网络中http的资源(不是https)时,可能访问不了,需要Manifest文件中对网络安全性校验进行配置。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值