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

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条)

报告相同问题?

悬赏问题

  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 spring后端vue前端
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题