qq_38490134 2019-07-17 11:23 采纳率: 100%
浏览 1017
已采纳

Android Glide加载图片url带token过期时间的问题

Glide加载带token图片,token每次都不一样,以自定义GlideUrl,以token前面的url作为key值。
但是adb开启了glide的log,发现不管token怎么变,glide都是加载第一次那个token的url,服务器收到的也是旧的url,导致图片过期后加载不出来。
而在Glide的listener回调打印log,却是最新的tokenUrl。
调用glide清空缓存的方法也无效。

加载图片的方法代码

    MyGlideUrl glideUrl = new MyGlideUrl(url).build());
        Glide.with(context)
                .load(glideUrl)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        MyGlideUrl myGlideUrl = (MyGlideUrl) model;
                        Log.e(TAG, "glide-error-url= " + myGlideUrl.mUrl
                                + "\n e = " + e);
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        return false;
                    }
                })
                .placeholder(R.drawable.loading)
                .error(R.drawable.load_failed)
                .into(imageView);

自定义GlideUrl代码

    public static class MyGlideUrl extends GlideUrl {
        private String mUrl;

        public MyGlideUrl(String url) {
            super(url);
            mUrl = url;
        }

        @Override
        public String getCacheKey() {
            return toStringUrl().replace(findTokenParam(), "");
        }

        private String findTokenParam() {
            String tokenParam = "";
            int tokenKeyIndex = mUrl.indexOf("?auth_key=") >= 0 ? mUrl.indexOf("?auth_key=") :
                    mUrl.indexOf("&auth_key=");
            if (tokenKeyIndex != -1) {
                int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
                if (nextAndIndex != -1) {
                    tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
                } else {
                    tokenParam = mUrl.substring(tokenKeyIndex);
                }
            }

            return tokenParam;
        }
    }

adb开启glide的log:

      class com.bumptech.glide.load.engine.GlideException: Failed to load resource
    There was 1 cause:
    java.io.FileNotFoundException(http://xxx/icon?auth_key=1563264202)

glide监听回调的log:

    glide-error-url= http://xxx/icon?auth_key=1563266341
    e = com.bumptech.glide.load.engine.GlideException: Failed to load resource
  • 写回答

2条回答 默认 最新

  • qq_38490134 2019-07-20 15:50
    关注

    已解决,自定义ModuleLoader,使用okhttp或其他框架代替glide原生的HttpUrlConnection。可参考:https://www.jianshu.com/p/156b8b7

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号