[置顶] Glide 使用问题汇总———2017/06/12更新

来源:互联网 发布:最新软件开发方法 编辑:程序博客网 时间:2024/06/06 19:34

http://blog.csdn.net/qq569699973/article/details/52712615?locationNum=10

GitHub开源地址

使用Glide加载Gif和常见图片格式时出现的常见问题:

一、离线缓存策略的配置

[java] view plain copy
 print?
  1. .diskCacheStrategy(DiskCacheStrategy.ALL)  

如下几种:

[java] view plain copy
 print?
  1. /** Caches with both {@link #SOURCE} and {@link #RESULT}. */  
  2. ALL(truetrue),//全部都缓存  
  3. /** Saves no data to cache. */  
  4. NONE(falsefalse),//全都不缓存  
  5. /** Saves just the original data to cache. */  
  6. SOURCE(truefalse),//只缓存资源  
  7. /** Saves the media item after all transformations to cache. */  
  8. RESULT(falsetrue);//只缓存结果  


二、图片加载的监听

方法

[java] view plain copy
 print?
  1. Glide.with(this).load(advertisementBean.getImageUrl()).diskCacheStrategy(DiskCacheStrategy.ALL).listener(new RequestListener<String, GlideDrawable>() {  
  2.                 @Override  
  3.                 public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {  
  4.                     return false;  
  5.                 }  
  6.   
  7.                 @Override  
  8.                 public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {  
  9.                     Times(TIME_OUT);  
  10.                     tv_countdown.setVisibility(View.VISIBLE);  
  11.                     return false;  
  12.                 }  
  13.             }).into(iv_advert_img);  

问题:当外层的View的Visibility属性GONE时,OnResourceReady方法体内部分代码不会被执行


这是作者给的解释:

Glide加载图片 into到ImageView中,必须要知道ImageView的宽、高,他才能知道怎么加载图片,所以监听加载过程时要确保ImageView不是GONE,否则你会发现OnResourceReady方法体内的部分代码永远不被执行...


Update 16-10-20

case:

服务器返回图片 url Glide 无法加载,Glide 是不会走onResourceReady,而是直接走onException,所以在onResourceReady做的相关操作,在onException的时候也要在方法体内做好对应的处理。


Update 16-12-02

自定义圆形占位图及使用ImageView+GLide加载圆形图片

[java] view plain copy
 print?
  1. Glide.with(ctx).load(TaskBeanNew.getBusinessImg()).asBitmap().placeholder(R.drawable.defult_head).centerCrop().into(new BitmapImageViewTarget(viewHolder.img_icon) {  
  2.                 @Override  
  3.                 protected void setResource(Bitmap resource) {  
  4.                     RoundedBitmapDrawable circularBitmapDrawable =  
  5.                             RoundedBitmapDrawableFactory.create(ctx.getResources(), resource);  
  6.                     /** 
  7.                      * 加载圆形图片 
  8.                      */  
  9.                     circularBitmapDrawable.setCircular(true);  
  10.                     viewHolder.img_icon.setImageDrawable(circularBitmapDrawable);  
  11.                 }  
  12.   
  13.   
  14.                 @Override  
  15.                 public void onLoadStarted(Drawable placeholder) {  
  16. //                            super.onLoadStarted(placeholder);  
  17.                     /** 
  18.                      * 覆盖原生方法,加载圆角占位图 
  19.                      */  
  20.                     RoundedBitmapDrawable circularBitmapDrawable =  
  21.                             RoundedBitmapDrawableFactory.create(ctx.getResources(), ((BitmapDrawable) placeholder).getBitmap());  
  22.                     circularBitmapDrawable.setCircular(true);  
  23.                     viewHolder.img_icon.setImageDrawable(circularBitmapDrawable);  
  24.                 }  
  25.   
  26.                 @Override  
  27.                 public void onLoadFailed(Exception e, Drawable errorDrawable) {  
  28. //                    super.onLoadFailed(e, errorDrawable);  
  29.                     /** 
  30.                      * 覆盖原生方法,加载圆角占位图 
  31.                      */  
  32.                     RoundedBitmapDrawable circularBitmapDrawable =  
  33.                             RoundedBitmapDrawableFactory.create(ctx.getResources(), ((BitmapDrawable) errorDrawable).getBitmap());  
  34.                     circularBitmapDrawable.setCircular(true);  
  35.                     viewHolder.img_icon.setImageDrawable(circularBitmapDrawable);  
  36.                 }  
  37.             });  

Update 17-03-08

代码如下:

[java] view plain copy
 print?
  1. public void loadRoundImage(final Context mContext, String url, final ImageView mImageView, int placeHolderResourceId) {  
  2.     if (null == mContext)  
  3.         return;  
  4.     Glide.with(mContext).load(url).asBitmap().placeholder(placeHolderResourceId).centerCrop().into(new BitmapImageViewTarget(mImageView) {  
  5.         @Override  
  6.         protected void setResource(Bitmap resource) {  
  7.             RoundedBitmapDrawable circularBitmapDrawable =  
  8.                     RoundedBitmapDrawableFactory.create(mContext.getResources(), resource);  
  9.             circularBitmapDrawable.setCircular(true);  
  10.             mImageView.setImageDrawable(circularBitmapDrawable);  
  11.         }  
  12.   
  13.   
  14.         @Override  
  15.         public void onLoadStarted(Drawable placeholder) {  
  16.             // super.onLoadStarted(placeholder);  
  17.             RoundedBitmapDrawable circularBitmapDrawable =  
  18.                     RoundedBitmapDrawableFactory.create(mContext.getResources(), ((BitmapDrawable) placeholder).getBitmap());  
  19.             circularBitmapDrawable.setCircular(true);  
  20.             mImageView.setImageDrawable(circularBitmapDrawable);  
  21.         }  
  22.   
  23.   
  24.         @Override  
  25.         public void onLoadFailed(Exception e, Drawable errorDrawable) {  
  26.                super.onLoadFailed(e, errorDrawable);  
  27.             RoundedBitmapDrawable circularBitmapDrawable =  
  28.                     RoundedBitmapDrawableFactory.create(mContext.getResources(), ((BitmapDrawable) errorDrawable).getBitmap());  
  29.             circularBitmapDrawable.setCircular(true);  
  30.             mImageView.setImageDrawable(circularBitmapDrawable);  
  31.         }  
  32.     });  
  33. }  


自定义圆形图片,占位图,错误图;


问题:

部分图片加载失败后 onLoadFailed 会重复走多次,且Exception 为 null,询问作者,但是没有给予答复,原因尚不明

解决办法

Glide.with(mContext) 使用的上下文采用Application的上下文 Glide.with(mContext.getApplicationContext())  解决;

 

17/06/12

问题:

加载大分辨率图片时,ImageView的scaleType设置不当,导致使用Glide时出现OOM

解决办法

ImageView的scaleType的问题,当设置为fitXY时,虽然ImageView显示那么点尺寸,但是,但是Glide加载图片时,却是以全分辨率加载的,于是加载几张,就OOM了。
改成fitCenter或者centerCrop(试了一下fitStart、fitEnd也行,总之看需求了),就好了,会自动缓存小图,滚动起来也非常流畅。