美文网首页
Glide基础用法加缓存

Glide基础用法加缓存

作者: wayDevelop | 来源:发表于2018-05-29 18:08 被阅读0次

这篇文章给大家介绍下android目前使用比较广泛的一个图片缓存库—Glide,这个库是google的一位开发人员在github上的一个开源项目。目前google的一些官方应用都在使用它,所以你现在就开始放心的用吧。
github地址
Glide基础用法加缓存

添加Glide
在module的build.gradle中添加以下依赖:
compile 'com.github.bumptech.glide:glide:3.7.0'

高级功能

Glide.with(this).load(url).skipMemoryCacge(true).into(imageview);
//跳过磁盘缓存,只在内存缓存(NONE表示什么都不缓存)
Glide.with(this).load(url).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageview);
//显示缩略图(显示原始图像的10%)
Glide.with(this).load(url).thumbnail(0.1f).into(imageview)

常用功能

Glide.with(this).load(url).placeholder(R.mipmap.ic_launcher).into(imageview);
//错误占位符
Glide.with(this).load(url).error(R.mipmap.ic_launcher).into(imageview);
//强制显示淡入淡出功能,300表示动画时间300ms
Glide.with(this).load(url).crossFade(300).into(imageview);
//不要淡入淡出效果
Glide.with(this).load(url).dontAnimate().into(imageview);
//改变图片大小,单位是pixel
Glide.with(this).load(url).override(500,500).into(imageview);
//Glide可以直接显示Gif
Glide.with(this).load(gif_url).into(imageview);
//也可以只显示Glide的第一帧作为普通图片使用
Glide.with(this).load(gif_url).asBitmap().into(imageview);
//也可以强制显示Gif,如果目标url不是gif则调用error()方法
Glide.with(this).load(gif_url).asGif().into(imageview);
//还可以显示视频,但目前只支持本地视频
Glide.with(this).load(Uri.fromFile(new File(local_video_path))).into(imageview); 

Glide 加载图片监听

  Glide.with(getActivity()).load(url)
                .listener(new RequestListener<String, GlideDrawable>() {
                    @Override
                    public boolean onException(Exception e, String model,
                                               Target<GlideDrawable> target,
                                               boolean isFirstResource) {
                        // 可替换成进度条
                        Toast.makeText(getActivity(), "图片加载失败", Toast.LENGTH_SHORT).show();
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GlideDrawable resource, String model,
                                                   Target<GlideDrawable> target,
                                                   boolean isFromMemoryCache,
                                                   boolean isFirstResource) {
                        // 图片加载完成,取消进度条
                        Toast.makeText(getActivity(), "图片加载成功", Toast.LENGTH_SHORT).show();
                        return false;
                    }
                }).error(R.mipmap.ic_launcher_round)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(demo);

Glide 获取bitmap

        Glide.with(getActivity()).load(url).asBitmap().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                Log.w("TAG", "secd------->" + resource.hashCode());
                demo.setImageBitmap(resource);
            }
        }); //方法中设置asBitmap可以设置回调类型

```![11527749649_.pic.jpg](https://img.haomeiwen.com/i6970555/49796a9c0725d4ff.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

###Glide-内存缓存与磁盘缓存
Glide的缓存资源分为两种:
- 原图(SOURCE) :原始图片
- 处理图(RESULT) :经过压缩和变形等处理后的图片

内存缓存策略(skipMemoryCache)
Glide默认是会在内存中缓存处理图(RESULT)的.
可以通过调用skipMemoryCache(true)来设置跳过内存缓存
#####跳过内存缓存
 >Glide.with(this).load(mUrl).skipMemoryCache(true).into(mIv);

磁盘缓存策略(diskCacheStrategy)
Glide的缓存读取顺序是 内存–>磁盘–>网络
Glide磁盘缓存策略分为四种,默认的是RESULT
- ALL:缓存原图(SOURCE)和处理图(RESULT)
- NONE:什么都不缓存
- SOURCE:只缓存原图(SOURCE)
- RESULT:只缓存处理图(RESULT) —默认值


 磁盘缓存大小

**磁盘缓存大小: 250 * 1024 * 1024(250MB)**

/** 250 MB of cache. */
int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;


 磁盘缓存目录

**默认磁盘缓存目录: 项目/cache/image_manager_disk_cache**

String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";

清除缓存

**清除所有内存缓存(需要在Ui线程操作)**

Glide.get(this).clearMemory();


**清除所有磁盘缓存(需要在子线程操作)**

Glide.get(MainActivity.this).clearDiskCache();


####Glide-通过Modules定制Glide
**创建一个类实现GlideModule**

public class WangGlideModule implements GlideModule {

@Override
public void applyOptions(Context context, GlideBuilder builder) {
   //TODO
}

@Override
public void registerComponents(Context context, Glide glide) {
   //TODO
}

}


**配置清单文件**

**在AndroidManifest中配置刚刚创建的GlideModule,需要在application节点下添加**

<application>
...

<meta-data
    android:name="com.demo.WangGlideModule"
    android:value="GlideModule" />

</application>


**其中android:name就是刚才创建的GlideModule的实现类**

**进行自定义配置**

**刚才创建的GlideModule的实现类时,会要实现两个方法,这里要用到的是其中的applyOptions方法,applyOptions方法里面提供了一个GlideBuilder,通过GlideBuilder我们就能实现自定义配置了**

public class WangGlideModule implements GlideModule {

@Override
public void applyOptions(Context context, GlideBuilder builder) {

    builder.setDiskCache();//自定义磁盘缓存

    builder.setMemoryCache();//自定义内存缓存

    builder.setBitmapPool(); //自定义图片池

    builder.setDiskCacheService();//自定义本地缓存的线程池

    builder.setResizeService();//自定义核心处理的线程池

    builder.setDecodeFormat();//自定义图片质量

}

@Override
public void registerComponents(Context context, Glide glide) {
    //TO
}

}


**配置默认图片质量**

**用过Picasso的朋友应该知道,Picasso默认的图片质量是ARGB_8888,而Glide默认的图片质量是RGB_565,这里我们就来修改默认配置,让Glide的默认质量为ARGB_8888**

(ARGB_8888是指32位图,即每个像素占4byte) 
(RGB_565是16位图,即每个像素占2byte)

public class WangGlideModule implements GlideModule {

@Override
public void applyOptions(Context context, GlideBuilder builder) {

    //自定义图片质量
    builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

}

@Override
public void registerComponents(Context context, Glide glide) {
    //TO
}

}


##Glide-自定义缓存

**自定义内存缓存**

**通过调用builder的setXXX方法就可以自定义内存缓存的大小了**

(**MemoryCach**以及**BitmapPool**都与内存缓存有关)

public class WangGlideModule implements GlideModule {

@Override
public void applyOptions(Context context, GlideBuilder builder) {
    //配置内存缓存大小 10MB
    builder.setMemoryCache(new LruResourceCache(10*1024*1024));
    //配置图片池大小   20MB
    builder.setBitmapPool(new LruBitmapPool(20*1024*1024));
}

@Override
public void registerComponents(Context context, Glide glide) {

}

}


**但是内存缓存的大小数值其实不应该是随便配置的,Glide的内部的默认值是通过一系列的计算获取的,比如说判断手机是否高配置手机等(有兴趣的可以去看他的源码,或者等待本系列后面的源码分析)** 
**这样有个取巧的办法,就是获取Glide默认的设置,然后在这个设置的基础上进行修改**

public class WangGlideModule implements GlideModule {

@Override
public void applyOptions(Context context, GlideBuilder builder) {
    //获取内存计算器
    MemorySizeCalculator calculator = new MemorySizeCalculator(context);
    //获取Glide默认内存缓存大小
    int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
    //获取Glide默认图片池大小
    int defaultBitmapPoolSize  = calculator.getBitmapPoolSize();
    //将数值修改为之前的1.1倍
    int myMemoryCacheSize  = (int) (1.1 * defaultMemoryCacheSize);
    int myBitmapPoolSize   = (int) (1.1 * defaultBitmapPoolSize);
    //修改默认值
    builder.setMemoryCache(new LruResourceCache(myMemoryCacheSize));
    builder.setBitmapPool(new LruBitmapPool(myBitmapPoolSize));
}

@Override
public void registerComponents(Context context, Glide glide) {

}

}


**自定义磁盘缓存**

磁盘缓存按照访问权限及路径可以分为两种 
- 私有缓存 (自己本app可以使用,目录在data/data/应用包名 下面) 
- 外部缓存(都可以访问,目录在扩展空间内,如SD卡)

* * *

**私有缓存**

**下面这样配置的话,主要是修改缓存大小,缓存路径仍为默认路径(即data/data/应用包名/cache/image_manager_disk_cache)**

public class WangGlideModule implements GlideModule {

@Override
public void applyOptions(Context context, GlideBuilder builder) {
    //设置磁盘缓存大小
    int size = 100 * 1024 * 1024;
    //设置磁盘缓存
    builder.setDiskCache(new InternalCacheDiskCacheFactory(context, size));
}

@Override
public void registerComponents(Context context, Glide glide) {

}

}


**如果需求修改缓存路径的话,需要增加一下参数即可(变为data/data/应用包名/cache/xiayu)**

//设置磁盘缓存大小
int size = 100 * 1024 * 1024;
String dir = "xiayu";
//设置磁盘缓存
builder.setDiskCache(new InternalCacheDiskCacheFactory(context,dir, size));

* * *

**外部缓存**

**下面这样配置的话,缓存会在 SDCard/Android/data/应用包名/cache/image_manager_disk_cache目录下**

public class WangGlideModule implements GlideModule {

@Override
public void applyOptions(Context context, GlideBuilder builder) {
    //设置磁盘缓存大小
    int size = 100 * 1024 * 1024;
    //设置磁盘缓存
    builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, size));
}

@Override
public void registerComponents(Context context, Glide glide) {

}

}


**如果需求修改缓存路径的话,需要增加一下参数即可(变为SDCard/Android/data/应用包名/cache/xiayu)**

//设置磁盘缓存大小
int size = 100 * 1024 * 1024;
String dir = "xiayu";
//设置磁盘缓存
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,dir, size));

**私有缓存目录和外部缓存的目录的区别是**
`new ExternalCacheDiskCacheFactory`
 `new InternalCacheDiskCacheFactory`

**完全自定义路径**
通过`new DiskLruCacheFactory`来实现

**上面两种缓存都是把缓存的父目录定死的,能够改变的只是子目录,Glide还提供了一种方式可以完全自定义缓存目录**

**(需要注意的是这里的路径是配置的绝对路径,所以如果没有指定在sd卡目录下的话是无法直接看到的)**

public class WangGlideModule implements GlideModule {

@Override
public void applyOptions(Context context, GlideBuilder builder) {
    //设置磁盘缓存大小
    int size = 100 * 1024 * 1024;
    String dirFolder = "GlideDisk";
    String dirName = "wang";
    //设置磁盘缓存
    builder.setDiskCache(new DiskLruCacheFactory(dirFolder, size));

    //builder.setDiskCache(new DiskLruCacheFactory(dirFolder, dirName,size));
}

@Override
public void registerComponents(Context context, Glide glide) {

}

运行后手机文件夹里面多出来一个GlideDisk文件夹,这个就是磁盘缓存的目录


31527749650_.pic.jpg 11527749649_.pic.jpg

相关文章

网友评论

      本文标题:Glide基础用法加缓存

      本文链接:https://www.haomeiwen.com/subject/lgbajftx.html