精华内容
下载资源
问答
  • glide获取缓存图片的方法

    千次阅读 2019-02-14 15:38:07
    首先使用glide加载网络图片,然后有硬盘缓存,从缓存获取图片。设置diskCacheStrategy方法的缓存策略为DiskCacheStrategy.ALL或者DiskCacheStrategy.SOURCE 1、Glide.with(mContext).load(url).asBitmap().into...

    首先使用glide加载网络图片,然后有硬盘缓存,从缓存中获取图片。设置diskCacheStrategy方法的缓存策略为DiskCacheStrategy.ALL或者DiskCacheStrategy.SOURCE
    1、Glide.with(mContext).load(url).asBitmap().into(new SimpleTarget() {
    @Override
    public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
    image.setImageBitmap(resource);
    }
    2、Bitmap myBitmap = Glide.with(applicationContext)

    .load(yourUrl)

    .asBitmap() //必须

    .centerCrop()

    .into(500, 500)

    .get()
    3、FutureTargetfuture = Glide.with(mContext)
    .load(“url”)
    .downloadOnly(500, 500);
    try {
    File cacheFile = future.get();
    String path = cacheFile.getAbsolutePath();
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (ExecutionException e) {
    e.printStackTrace();
    }

    展开全文
  • 获取Glide缓存空间大小 这个网上也有过一些介绍,但是给出实现代码存在一些问题,我这里做了一定修改.一下方法适合在Glide为默认缓存目录情况,不论是内部存储空间还是外部.因为我们可以通过Inte
  • android glide 获取缓存图片

    万次阅读 2017-03-08 15:02:19
    Glide是Google推荐用的图片加载框架,很简单就可以加载出图片了,如下: Glide.with(context).load(ImgUrl).into(ImageView); 也可以加一些常用的功能,如placeHolder图片等等,如下: Glide.with(context).load...

    Glide是Google推荐用的图片加载框架,很简单就可以加载出图片了,如下:

    Glide.with(context).load(ImgUrl).into(ImageView);

    也可以加一些常用的功能,如placeHolder图片等等,如下:

    Glide.with(context).load(ImgUrl)
          .asBitmap()
          .error(R.drawable.error)
          .placeholder(R.drawable.loading)
          .dontAnimate()
          .diskCacheStrategy(DiskCacheStrategy.ALL)
          .into(ImageView);
    load():  String(文件路径,网络地址),File(文件资源),Integer(资源id); 

    asGif: 表示的gif动画

    asBitmap:表示静态图 

    diskCacheStrategy 磁盘缓存策略:
    (1) DiskCacheStrategy.RESULT: 展示小大的图片缓存
    (2) DiskCacheStrategy.ALL: 展示在控件中大小图片尺寸和原图都会缓存
    (3) DiskCacheStrategy.NONE:不设置缓存
    (4) DiskCacheStrategy.SOURCE:原图缓存

    placeholder(R.drawable.loading):  目标从加载到展示时的控件的显示状态(多用网络加载动画)  

    error(R,drawable,error):  加载失败时,控件显示的图片。

    into(ImageView):  展示的控件


    使用Glide加载图片,下载成功它会缓存一份到本地,提供Glide本身的加载策略,进而提高加载的速度

    如果有些需求要拿到缓存的图片是怎么做呢,那么Glide的缓存是怎么样能拿到的呢?

    答:Glide提供了一个downloadOnly() 接口来获取缓存的图片文件,但是前提必须要设置diskCacheStrategy方法的缓存策略为DiskCacheStrategy.ALL或者DiskCacheStrategy.SOURCE,还有downloadOnly()方法需要在线程里进行,如下:

    private class getImageCacheAsyncTask extends AsyncTask<String, Void, File> {
            private final Context context;
    
            public getImageCacheAsyncTask(Context context) {
                this.context = context;
            }
    
            @Override
            protected File doInBackground(String... params) {
                String imgUrl =  params[0];
                try {
                    return Glide.with(context)
                            .load(imgUrl)
                            .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                            .get();
                } catch (Exception ex) {
                    return null;
                }
            }
    
            @Override
            protected void onPostExecute(File result) {
                if (result == null) {
                    return;
                }
                //此path就是对应文件的缓存路径
                String path = result.getPath();
                Log.e("path", path);
                Bitmap bmp= BitmapFactory.decodeFile(path);
                img.setImageBitmap(bmp);
                
            }
        }

    调用:

    new getImageCacheTask(this).execute(“url”);
    就可以获取到缓存的图片显示在imageView上了

    上面对应的path就是Glide缓存图片的路径,类似这样的:

     /data/data/包名/cache/image_manager_disk_cache/6872faf4075a6461f3d7ceb2e5ff625beeaae67d3b7e44a0d1e3cd332aa471dc.0

    就这样很轻松的获取Glide的缓存


    https://github.com/bumptech/glide/issues/459





    展开全文
  • 清除Glide缓存 Glide自带清除缓存的功能,分别对应Glide.get(context).clearDiskCache();(清除磁盘缓存)与Glide.get(context).clearMemory();(清除内存缓存)两个方法.其中clearDiskCache()方法必须运行在...获取Glide

    感恩原创:http://www.jianshu.com/p/468bd4621f6e

    清除Glide缓存
    Glide自带清除缓存的功能,分别对应Glide.get(context).clearDiskCache();(清除磁盘缓存)与Glide.get(context).clearMemory();(清除内存缓存)两个方法.其中clearDiskCache()方法必须运行在子线程,clearMemory()方法必须运行在主线程,这是这两个方法所强制要求的,详见源码.

    获取Glide缓存空间大小
    这个网上也有过一些介绍,但是给出的实现代码存在一些问题,我这里做了一定的修改.一下方法适合在Glide为默认的缓存目录的情况,不论是内部存储空间还是外部.因为我们可以通过InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR与ExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR获取到位于内部与外部存储的缓存文件夹的文件夹名,并通过context.getCacheDir()与context.getExternalCacheDir()获取内部与外部存储的路径.进而可以通过遍历文件夹内的文件进行缓存文件大小求和与全部清除.以下工具类在其他的文章中有前辈写过,但是存在一些已知的问题,这里做了一些修改.

    import android.content.Context;
    import android.os.Looper;
    import android.text.TextUtils;
    
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory;
    import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
    
    import java.io.File;
    import java.math.BigDecimal;
    
    /**Glide缓存工具类
    * Created by Trojx on 2016/10/10 0010.
    */
    
    public class GlideCacheUtil {
    private static GlideCacheUtil inst;
    
    public static GlideCacheUtil getInstance() {
    if (inst == null) {
    inst = new GlideCacheUtil();
    }
    return inst;
    }
    
    /**
    * 清除图片磁盘缓存
    */
    public void clearImageDiskCache(Context context) {
    try {
    if (Looper.myLooper() == Looper.getMainLooper()) {
    new Thread(new Runnable() {
    @Override
    public void run() {
    Glide.get(context).clearDiskCache();
    // BusUtil.getBus().post(new GlideCacheClearSuccessEvent());
    }
    }).start();
    } else {
    Glide.get(context).clearDiskCache();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    
    /**
    * 清除图片内存缓存
    */
    public void clearImageMemoryCache(Context context) {
    try {
    if (Looper.myLooper() == Looper.getMainLooper()) { //只能在主线程执行
    Glide.get(context).clearMemory();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    
    /**
    * 清除图片所有缓存
    */
    public void clearImageAllCache(Context context) {
    clearImageDiskCache(context);
    clearImageMemoryCache(context);
    String ImageExternalCatchDir=context.getExternalCacheDir()+ExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR;
    deleteFolderFile(ImageExternalCatchDir, true);
    }
    
    /**
    * 获取Glide造成的缓存大小
    *
    * @return CacheSize
    */
    public String getCacheSize(Context context) {
    try {
    return getFormatSize(getFolderSize(new File(context.getCacheDir() + "/"+InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR)));
    } catch (Exception e) {
    e.printStackTrace();
    }
    return "";
    }
    
    /**
    * 获取指定文件夹内所有文件大小的和
    *
    * @param file file
    * @return size
    * @throws Exception
    */
    private long getFolderSize(File file) throws Exception {
    long size = 0;
    try {
    File[] fileList = file.listFiles();
    for (File aFileList : fileList) {
    if (aFileList.isDirectory()) {
    size = size + getFolderSize(aFileList);
    } else {
    size = size + aFileList.length();
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return size;
    }
    
    /**
    * 删除指定目录下的文件,这里用于缓存的删除
    *
    * @param filePath filePath
    * @param deleteThisPath deleteThisPath
    */
    private void deleteFolderFile(String filePath, boolean deleteThisPath) {
    if (!TextUtils.isEmpty(filePath)) {
    try {
    File file = new File(filePath);
    if (file.isDirectory()) {
    File files[] = file.listFiles();
    for (File file1 : files) {
    deleteFolderFile(file1.getAbsolutePath(), true);
    }
    }
    if (deleteThisPath) {
    if (!file.isDirectory()) {
    file.delete();
    } else {
    if (file.listFiles().length == 0) {
    file.delete();
    }
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    
    /**
    * 格式化单位
    *
    * @param size size
    * @return size
    */
    private static String getFormatSize(double size) {
    
    double kiloByte = size / 1024;
    if (kiloByte < 1) {
    return size + "Byte";
    }
    
    double megaByte = kiloByte / 1024;
    if (megaByte < 1) {
    BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
    return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
    }
    
    double gigaByte = megaByte / 1024;
    if (gigaByte < 1) {
    BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
    return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
    }
    
    double teraBytes = gigaByte / 1024;
    if (teraBytes < 1) {
    BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
    return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
    }
    BigDecimal result4 = new BigDecimal(teraBytes);
    
    return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
    }
    }

    通过它就能实现一个清除图片缓存的功能,在应用中实现的效果如下:
    这里写图片描述

    这里写图片描述

    展开全文
  • Glide获取图片缓存文件名Key

    千次阅读 2020-01-10 18:30:12
    今天同事碰到一个问题,跟了3天了,他的由于项目中用了Glide图片加载框架,而我们的图片Url又有进行CDN裁剪,他的项目中有小图,中图,大图,三种分辨率的图片,发现当有了大图后,小图去加载时,由于url中带了尺寸...

    今天同事碰到一个问题,他的由于项目中用了Glide图片加载框架,而我们的图片Url又有进行CDN裁剪,他的项目中有小图,中图,大图,三种分辨率的图片,发现当有了大图后,小图去加载时,由于url中带了尺寸做CDN图片裁剪,如: http://xxxxxx.jpg?xxxxxx_120_120.jpg,这样的话,Glide生成的缓存path就不一样,导致多次重新拉取小图。

    解决问题最好的方法就是清楚问题后,再找代码了。
    这个问题转换为:获取url到缓存文件path的生成规则算法上。
    找到Glide最终生成path的路径为:/data/data/your_packagexxxxxxx/cache/image_manager_disk_cache
    找到对应的生成规则:com.bumptech.glide.load.engine.EngineKey#updateDiskCacheKey

    具体阅读代码的过程不累赘,直接把获取函数贴出来哈。

    Glide 3.+版本

    /**
         * Glide缓存存储路径:/data/data/your_packagexxxxxxx/cache/image_manager_disk_cache
         * Glide文件名生成规则函数 : 3.0+ 版本
         *
         * @autor 胖虎 https://blog.csdn.net/ljphhj
         *
         * @param url 传入您的图片地址url
         * @param width 设备屏幕分辨率的宽度 eg : 1080
         * @param height 设备屏幕分辨率的高度 eg : 1920
         * @return
         */
        private String getGlide3_SafeKey(String url, int width, int height){
            byte[] dimensions = ByteBuffer.allocate(8)
                    .putInt(width)
                    .putInt(height)
                    .array();
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
    
                EmptySignature signature = EmptySignature.obtain();
                signature.updateDiskCacheKey(messageDigest);
                messageDigest.update(url.getBytes(STRING_CHARSET_NAME));
                messageDigest.update(dimensions);
                messageDigest.update("".getBytes(STRING_CHARSET_NAME));
                messageDigest.update("ImageVideoBitmapDecoder.com.bumptech.glide.load.resource.bitmap".getBytes(STRING_CHARSET_NAME));
                messageDigest.update("FitCenter.com.bumptech.glide.load.resource.bitmap".getBytes(STRING_CHARSET_NAME));
                messageDigest.update("BitmapEncoder.com.bumptech.glide.load.resource.bitmap".getBytes(STRING_CHARSET_NAME));
                messageDigest.update("".getBytes(STRING_CHARSET_NAME));
    
                String safeKey = Util.sha256BytesToHex(messageDigest.digest());
                return safeKey + ".0";
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    Glide 4.+版本

        /**
         * Glide缓存存储路径:/data/data/your_packagexxxxxxx/cache/image_manager_disk_cache
         * Glide文件名生成规则函数 : 4.0+ 版本
         *
         * @autor 胖虎 https://blog.csdn.net/ljphhj
         *
         * @param url 传入您的图片地址url
         * @return
         */
        private String getGlide4_SafeKey(String url) {
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
                EmptySignature signature = EmptySignature.obtain();
                signature.updateDiskCacheKey(messageDigest);
                new GlideUrl(url).updateDiskCacheKey(messageDigest);
                String safeKey = Util.sha256BytesToHex(messageDigest.digest());
                return safeKey + ".0";
            } catch (Exception e) {
            }
            return null;
        }
    
    展开全文
  • Glide获取某个url对应的缓存图片

    万次阅读 热门讨论 2017-10-26 18:37:05
    Glide这么久了,我一直有个疑问,Glide该如何获取到指定的缓存图片?原生Glide是没有提供任何Api用来获取缓存图片的,至少我是没找到。翻看Glide源码(3.7),发现其中一个叫:EngineKey类,Glide通过该类来查找...
  • 这里是对一系列方法进行了封装,在大神博客里复制过来代码public class ... * 获取缓存大小 * @param context * @return * @throws Exception */ public static String getTotalCacheSize(Cont
  • 什么是三级缓存? 内存缓存,优先加载,速度最快 本地缓存,次优先加载,速度快 ...但是,每次启动应用都要从网络获取图片,或者是想重复浏览一些图片的时候,每次浏览都需要网络获取,消耗流量就多了,...
  • Glide缓存机制

    2021-04-13 00:08:13
    文章目录缓存机制加载流程LRU 机制总结 上一篇文章介绍了Glide的源码解析 的主线流程,这里说下Glide...如果有,则把内存缓存的图片拿到活动缓存,然后再去加载; 如果内存缓存没有,则去磁盘缓存获取。如果有,则
  • Glide提供简洁易用api,整个框架也方便扩展,比如可以替换网络请求库,同时也提供了完备的缓存机制,应用层不需要自己去管理图片的缓存获取,框架会分成内存缓存,文件缓存和远程缓存。本文不会从简单使用着手...
  • Glide获取磁盘缓存

    千次阅读 2018-06-11 17:00:24
    这个需求来源是在一个图片的列表里。这个图片列表显示的是...但是,glide尽然没有提供一个简单的获取磁盘缓存的方法。。。。。好吧,开始趟坑之路。其实做之前想了下,图片加载的三级缓存这个感觉是基本的功能啊。...
  • Glide图片缓存

    2017-06-08 20:06:44
    Glide简介:  Glide 是 Google 员工开源项目,...Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一
  • Glide缓存流程

    2019-09-26 09:42:51
    本文首发于 vivo互联网技术 微信公众号 ...Glide提供简洁易用api,整个框架也方便扩展,比如可以替换网络请求库,同时也提供了完备的缓存机制,应用层不需要自己去管理图片的缓存获取,框架会分成内存...
  • android Glide 获取磁盘缓存

    万次阅读 2016-10-13 19:18:07
    Glide是Google推荐的图片加载库, 加载图片一般以下面的形式:Glide.with(context).load(ImgUrl) ..asBitmap() .error(R.drawable.error) .placeholder(R.drawable.loading) .dontAnimate() .diskCacheStrateg
  • 在官方github的issues1497找到了相关的回答,picasso没有磁盘缓存,他将磁盘缓存委托给了底层http,所以picasso无法通过任何schema获取到对应的已缓存的图片路径,但是可以通过上面的代码,或者通过into(target)的...
  • Glide 判断图片是否缓存

    千次阅读 2020-06-12 09:56:29
    Glide 判断图片是否缓存 Glide版本4.9.0 大多数文章的Glide 缓存判断都是异步,可以实现功能但使用起来很不友好。通过分析源码,总结出了同步判断方法。 1.通过反射,获取缓存File。 public static File get...
  • Glide图片缓存知识点

    2016-10-09 14:25:43
    本文转载参考地址是网友发表文章:http://www.cnblogs.com/whoislcj/p/5558168.html。 ...Glide简介: ... Glide 是 Google 员工开源项目, Google I/O 上被推荐使用,一个高效、开源、...Glide具有获取、解码和
  • Glide清除缓存

    2018-01-26 10:43:00
    今天主要给大家介绍一下关于怎么获取Glide的图片缓存和清除图片缓存,其实很简单,下面是写的一个工具类,简单易懂,便捷好用! import android.content.Context; import android.os.Loope...
  • 文章目录LruCache概述原理DiskLruCache概述Glide缓存概述资源分类缓存设计Glide 缓存源码分析1、生成key2、创建缓存对象LruResourceCache3、获取内存缓存中的图片4、开启加载图片线程5、获取磁盘缓存6、写入磁盘7、...
  • Glide 清理缓存

    2018-09-05 21:07:26
    公司项目里面图片比较多,也使用了Glide的本地缓存,因此时间长了会产生很多图片缓存,强大的Glide也提供了相应API來清除缓存,首先要获取缓存大小, @Nullable public static File getPhotoCacheDir(@NonNull ...
  • 既然Glide的功能这么强大,那么就一定要学习下源码,看看内部是怎样工作Glide.with((Fragment) t).load(url).into(imageView); 为了好理解,将上面一行代码进行分解: RequestManager requestManager = ...

空空如也

空空如也

1 2 3 4 5 6
收藏数 114
精华内容 45
关键字:

获取glide缓存的图片