记glide框架使用中所遇到的问题
最近实在是太忙,每有时间写博客。记得之前写过一篇关于glide加载图片不显示的博客,但是给出最终的解决方法。这次我将把在项目中使用glide所遇到的问题总结一下。
1.使用glide最好对glide进行全局的配置,此时需要写一个继承GlideModule的GlideModelConfig类
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) { // 默认内存和图片池大小 MemorySizeCalculator calculator = new MemorySizeCalculator(context); int defaultMemoryCacheSize = calculator.getMemoryCacheSize(); // 默认内存大小 int defaultBitmapPoolSize = calculator.getBitmapPoolSize(); // 默认图片池大小 builder.setMemoryCache(new LruResourceCache(defaultMemoryCacheSize)); // 该两句无需设置,是默认的 builder.setBitmapPool(new LruBitmapPool(defaultBitmapPoolSize)); //定义图片的本地磁盘缓存 File cacheDir = context.getExternalCacheDir();//指定的是数据的缓存地址 int diskCacheSize = 1024 * 1024 * 30;//最多可以缓存多少字节的数据 //设置磁盘缓存大小 builder.setDiskCache(new DiskLruCacheFactory(cacheDir.getPath(), "glide", diskCacheSize)); // 定义缓存大小和位置 builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskSize)); //内存中 builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "cache", diskSize)); //sd卡中 // 定义图片格式 builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565); // 默认 // 自定义内存和图片池大小 builder.setMemoryCache(new LruResourceCache(memorySize)); builder.setBitmapPool(new LruBitmapPool(memorySize)); //builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override public void registerComponents(Context context, Glide glide) { } }
还得再在清单文件中,对该类进行配置
<meta-data android:name="com.***.GlideModelConfig" android:value="GlideModule"/>
2.当你使用的图片控件为CircleImagview的时候,会出现第一加载图片失败,当你再次下拉刷新的时候,才能展现出图片,此时的解决办法有以下几种
a.使用Imagview,如果你想使imagview变成圆形,有以下两种常用方法
1.使用xml的shape(此方法比较简单)
2.第二使用glide自带的圆形转化类
代码如下
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; // TODO this could be acquired from the pool too Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); return result; } @Override public String getId() { return getClass().getName(); } }
再在glide的使用中使用该类
/** * 头像设置成圆角 * * @param url * @param context * @param imageView */ public static void downLoadPicCircle1(String url, Context context, ImageView imageView) { Glide.with(context) .load(url) .diskCacheStrategy(DiskCacheStrategy.ALL) .placeholder(R.mipmap.touxiang) .error(R.mipmap.touxiang) .transform(new CircleTransform(context)) .into(imageView); }
这样iamgview就可以转化为圆形了。
2.第二个方法就是我上次使用glide所提出的解决方法,不要设置占位 http://www.cnblogs.com/jiutiankunpeng/p/5715201.html
ps:网上还有大神提出了如下代码的解决方法
Glide.with(mContext) .load(url) .placeholder(R.drawable.loading_spinner) .into(new SimpleTarget<Bitmap>(width, height) { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation anim) { // setImageBitmap(bitmap) on CircleImageView } };
3.在使用glide的时,又是程序会莫名其妙的崩溃,studio会提示如下错误 You cannot start a load for a destroyed activity
这个问题的解决方法是,将with(context)换成with(getAppliationContext),这样就不会爆这个错误了。
4.在glide中加入try catche(下面的代码,是使用glide加载本地图片)
public static void loadImage(@IdRes int resId, ImageView imageView) { try { Glide.with(imageView.getContext()) .load(resId) .dontAnimate()//直接显示图片而没有任何淡入淡出效果 .placeholder(R.drawable.default_diagram) .into(imageView); } catch (Exception e) { } }
最后,glide 还有很多其他知识,如内存的缓存策略,图片裁剪( override),请求图片的优先级等,一系列问题,这些东西大家都可以使用google找到学习资料,等下次有时间再一一介绍。