使用 RequestListener
接口,例如:
Glide.with(fragment)
.load(url)
.listener(new RequestListener() {
@Override
boolean onLoadFailed(@Nullable GlideException e, Object model,
Target<R> target, boolean isFirstResource) {
@Override
boolean onResourceReady(R resource, Object model, Target<R> target,
DataSource dataSource, boolean isFirstResource) {
.into(imageView);
引入另一个话题:在展示高分辨率图片的时候,最好先将图片进行压缩,压缩后的图片大小应该和用来展示它的控件大小相近。在一个很小的ImageView上显示一张超大的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存,而且在性能上还可能会带来负面影响。
mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));
通过设置BitmapFactory.Options中inSampleSize的值就可以实现。比如我们有一张2048*1536像素的图片,将inSampleSize的值设置为4,就可以把这张图片压缩成512*384像素
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
return inSampleSize;
- BitmapFactory这个类提供了多个解析方法
(decodeByteArray, decodeFile, decodeResource等)
用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法
- SD卡中的图片可以使用decodeFile方法
- 网络上的图片可以使用decodeStream方法
- 资源文件中的图片可以使用decodeResource方法
- 这些方法会尝试为已经构建的bitmap分配内存,这时就会很容易导致OOM出现。
- 为此每一种解析方法都提供了一个可选的BitmapFactory.Options参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象,而是null。
- 虽然Bitmap是null了,但是BitmapFactory.Options的outWidth、outHeight和outMimeType属性都会被赋值。这个技巧让我们可以在加载图片之前就获取到图片的长宽值和MIME类型,从而根据情况对图片进行压缩
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
glide和picassoGlide和Picasso都是图片加载框架,用法相似://Glide的用法Glide.with(context).load(url).into(imageView);//Picasso的用法Picasso.with(context).load(url).into(imageView);不同的地方,也是Glide的优点:with()方法里面的参数可以是Context、Activity、Fragment,并且后面两个参数类型可以使这个图片和后面连个参数的生命周期绑定。
前言:这一节里面我们将介绍Glide如何对图片进行压缩,这一点在加载图片较多或者加载的图片像素很高的程序里面至关重要1.Android图片显示相关知识这里会讲一下图片显示相关的基础知识,如果不关心的可以直接跳到第二点,不过建议是最好看一下1.1图片质量分类安卓图片显示的质量配置主要分为四种:
ARGB_8888 :32位图,带透明度,每个像素占4个字节
ARGB_4444 :16位图,带透明度,每个
软件开发网在此之前给大家介绍过图片加载框架Glide的基本用法介绍,大家可以先参考一下,本篇内容更加深入的分析了Glide获取图片Path、Bitmap用法,以及实现的代码分析。
1. 获取Bitmap:
1)在图片下载缓存好之后获取
Glide.with(mContext).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> gl
项目中遇到,需要用户上传图片的场景。结果用户上传的、特别是拍摄后的图片,分辨率很大,长宽2000多3000甚至更高,一个图片5MB以上。 造成之后,从网络上加载这些图片,比较慢。
所以,不得不在上传前进行压缩后,再上传。
//图片框架 https://github.com/bumptech/glide
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:comp...
如果 Glide 加载的图片出现错误或者无法显示的情况,可以考虑以下几个方面:
1. 图片链接错误:检查图片的链接是否正确,确保图片能够正常加载。如果图片链接错误,可以尝试更正链接。
2. 图片格式错误:Glide 支持多种图片格式,但是不支持所有的图片格式。如果图片格式不被支持,Glide 会无法加载图片。可以尝试将图片转换为支持的格式。
3. 缓存问题:Glide 会将图片缓存到本地,如果缓存的图片出现错误,就会导致加载错误或者无法显示。可以尝试清除 Glide 的缓存,或者在加载图片时禁用缓存。
4. 图片大小错误:如果图片太大,Glide 可能会无法加载。可以尝试将图片压缩到适当的大小。
如果以上方法都无法解决问题,可以考虑使用其他的图片加载库,或者检查代码中是否有其他问题导致图片无法正常加载。