zoukankan      html  css  js  c++  java
  • 记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找到学习资料,等下次有时间再一一介绍。

    善守者藏于九地之下, 善攻者动于九天之上
  • 相关阅读:
    input()和print()函数同时输入输出多个数据--python3
    2018-海信-算法工程师-面试问题
    2018-CVTE中央研究院-自然语言处理算法工程师-电话面问题
    windows服务demo
    C#获取刚插入的数据的id
    .net微软企业库的事务回滚
    C# NPOI的数据批量导入数据库
    C# 使用复选框实现循环添加多条信息入库!
    C# DataSet与DataTable的区别和用法
    C#如何编写短信接口,以及接口的调用,包括C#.net访问web,并处理返回值的简例。
  • 原文地址:https://www.cnblogs.com/jiutiankunpeng/p/6067909.html
Copyright © 2011-2022 走看看