qq_38490134
qq_38490134
采纳率100%
2019-07-17 11:23 阅读 745

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 qq_38490134 2019-07-20 15:50

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

    点赞 评论 复制链接分享
  • sxt_zls 狗屎糖 2019-07-17 11:42

    我做过类似的需求,每次请求图片带着ticket和一些认证信息,或许能帮到你

     Glide.with(this).load(
                    new GlideUrl(url,
                            new LazyHeaders.Builder()
                                    .addHeader(Constants.KEY_Authorization, authorization)
                                    .addHeader(Constants.KEY_Ticket, ticket)
                                    .build()))
                    .error("M".equals(gender) ? R.mipmap.men : R.mipmap.female)
                    .bitmapTransform(new GlideCircleTransform(this))
                    .signature(new StringSignature(signatureKey, "")))
                    .into(imgLarge);
    
    点赞 评论 复制链接分享

相关推荐