qq_38490134 2019-07-17 03:23 采纳率: 100%
浏览 1024
已采纳

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 07:50
    关注

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

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

报告相同问题?

悬赏问题

  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部