• Android使用Glide加载Gif慢 获取gif时间


    1,解决Glide加载Gif非常慢问题

       

    Glide.with(MainActivity.this).load(url).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView);  
    

      

    为其添加缓存策略,其中缓存策略可以为:Source及None,None及为不缓存,Source缓存原型.如果为ALL和Result就不行

    2,加载第一贞:

    Glide.with(context).load(gifUrl).asBitmap().into(imageViewGifAsBitmap);
    

     

    3,控制动画次数:
    Glide.with(this).load(getResource()).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(new GlideDrawableImageViewTarget(imageView, 1));
    

    4,GIF 时间:

                            Glide.with(FirstActivity.this)
                                    .load(file)
                                    .asGif()
                                    .fitCenter()
                                    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                                    .listener(new RequestListener<File, GifDrawable>() {
                                        @Override
                                        public boolean onException(Exception e, File model, Target<GifDrawable> target, boolean isFirstResource) {
                                        
                                            return false;
                                        }
    
                                        @Override
                                        public boolean onResourceReady(final GifDrawable resource, File model, Target<GifDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                                            new Thread(new Runnable() {
                                                @Override
                                                public void run() {
                                                    int duration = 0;
                                                    try {
                                                        GifDrawable gifDrawable = (GifDrawable) resource;
                                                        GifDecoder decoder = gifDrawable.getDecoder();
                                                        for (int i = 0; i < gifDrawable.getFrameCount(); i++) {
                                                            duration += decoder.getDelay(i);
                                                        }
    
                                                        mGifAdTime = duration;
                                                    } catch (Throwable e) {
                                                    }
                                                }
                                            }).start();
    
                                            return false;
                                        }
                                    })
                                    .into(mAdImg);

     4.+ 版本获取gif时间

    Glide.with(FirstActivity.this)
            .asGif()
            .load(file)
            .fitCenter()
            .diskCacheStrategy(DiskCacheStrategy.DATA)
            .listener(new RequestListener<GifDrawable>() {
                @Override
                public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
                    return false;
                }
    
                @Override
                public boolean onResourceReady(final GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            // 计算动画时长
                            int duration = 0;
                            try {
                                GifDrawable gifDrawable = (GifDrawable) resource;
                                //设置循环播放次数为1次
                                gifDrawable.setLoopCount(1);
                                //GifDecoder decoder = gifDrawable.getDecoder();//4.0开始没有这个方法了
                                Drawable.ConstantState state = gifDrawable.getConstantState();
                                if (state != null) {
                                    //不能混淆GifFrameLoader和GifState类
                                    Object gifFrameLoader = GlideGifUtil.getValue(state, "frameLoader");
                                    if (gifFrameLoader != null) {
                                        Object decoder = GlideGifUtil.getValue(gifFrameLoader, "gifDecoder");
                                        if (decoder != null && decoder instanceof GifDecoder) {
                                            for (int i = 0; i < gifDrawable.getFrameCount(); i++) {
                                                duration += ((GifDecoder) decoder).getDelay(i);
                                            }
                                        }
                                    }
                                }
                            } catch (Throwable e) {
                            }
                        }
                    }).start();
                    return false;
                }
            })
            .into(mAdImg);
    public class GlideGifUtil {
        /**
         * 通过字段名从对象或对象的父类中得到字段的值
         *
         * @param object    对象实例
         * @param fieldName 字段名
         * @return 字段对应的值
         * @throws Exception
         */
        public static Object getValue(Object object, String fieldName) throws Exception {
            if (object == null) {
                return null;
            }
            if (TextUtils.isEmpty(fieldName)) {
                return null;
            }
            Field field = null;
            Class<?> clazz = object.getClass();
            for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
                try {
                    field = clazz.getDeclaredField(fieldName);
                    field.setAccessible(true);
                    return field.get(object);
                } catch (Exception e) {
                    //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
                    //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
                }
            }
            return null;
        }
    }
  • 相关阅读:
    黄聪:.NET中zip的压缩和解压——SharpCompress
    黄聪:在.NET中使用GeckoFX 29
    【转】C# 开发Chrome内核浏览器(WebKit.net)
    Can annotations be created or edited in ArcGIS Pro?
    ArcGIS Pro 新建一个Aprx,导入Mxd
    ArcGIS Pro项目保存和数据编辑保存
    ArcGIS Pro批量线分割面,也可以线分割线
    ArcGIS Pro 删除选择范围的数据和批量裁剪clip
    ArcGIS Pro NearestVertex和NearestPoint
    ArcGIS Pro打印预览
  • 原文地址:https://www.cnblogs.com/xueqiang911226/p/8056739.html
Copyright © 2020-2023  润新知