Glide简单使用(二)

1. Glide缓存

分为两种,

  • 内存缓存

    • skipMemoryCache(true)
  • 磁盘缓存
    • DiskCacheStrategy.NONE 什么都不缓存,
    • DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
    • DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即,降低分辨率后的(或者是转换后的)
    • DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)


内存缓存

Glide默认将图片资源缓存到内存,当我们不想使用内存缓存时。跳过内存缓存skipMemoryCache(true)见名知意。同时,Glide将会仍然使用磁盘缓存,来避免重复请求网络数据。

Glide.with(this)
                .load("http://2f.zol-img.com.cn/product/104_1200x900/305/cevDJaCdeLQ6.gif")
                .override(800, 300)
                .skipMemoryCache(true) //跳过内存缓存
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher_round)
                .into(iv_2);

磁盘缓存

就不多说,直接上代码。

我们需要根据上述所给的几种类型,来选择你需要的方式。

Glide.with(this)
                .load("http://2f.zol-img.com.cn/product/104_1200x900/305/cevDJaCdeLQ6.gif")
                .override(800, 300)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher_round)
                .into(iv_2);

两种缓存都不使用

同时调用两个方法

Glide.with(this)
                .load("http://2f.zol-img.com.cn/product/104_1200x900/305/cevDJaCdeLQ6.gif")
                .override(800, 300)
                .skipMemoryCache(true) //跳过内存缓存
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher_round)
                .into(iv_2);


2.图片请求的优先级

在开发过程中,比如A图片是一张非常大的图片,B,C图片相对要小。这个时候我们需要让A图片先加载显示。我们就需要使用该方法。

这个枚举给了四个不同的选项,下面是按照递增priority(优先级)的列表:

  • Priority.LOW
  • Priority.NORMAL
  • Priority.HIGH
  • Priority.IMMEDIATE

    具体代码

这个时候会先加载 带有Priority.HIGH属性的图片资源,然后才去加载Priority.LOW属性的图片资源。

还有一个情况,是我在测试的时候遇到:

发现,如果优先级较低的图片有设置缓存数据,当我们第二次再次进入这个界面时,该图片会优先于未设置缓存数据的图片,先加载出来。可以自行测试

Glide.with(this)
                .load("http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg")
                .placeholder(R.drawable.ic_launcher)
                .error(R.mipmap.ic_launcher_round)
                .priority(Priority.LOW)
                .into(iv_1);
        tv_title2.setText("加载gif资源");

        Glide.with(this)
                .load("http://2f.zol-img.com.cn/product/104_1200x900/305/cevDJaCdeLQ6.gif")
                .override(800, 300)
                .priority(Priority.HIGH)
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher_round)
                .into(iv_2);


3.自定义缩略图

概述:缩略图不同于之前博客提到的占位符。占位符必须附带应用程序捆绑的资源才行。缩略图是动态占位符。它也可以从网络中加载。缩略图将会在实际请求加载完或者处理完之后才显示。如果缩略图对于任何原因,在原始图像到达之后,它不会取代原始图像。它只会被抹除。

Glide.with(this)
                .load("http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg")
                .thumbnail(0.1f)
                .into(iv_8);

thumbnail(0.1f)这个属性,实现的效果是原图1000*1000,缩小十倍100*100缩略图显示出来。

下面这种自定义缩略图

它的优点多说了,看上面的概述。

DrawableRequestBuilder<Integer> thumbail = Glide.with(this)
                .load(R.drawable.ic_pb_default);
        Glide.with(this)
                .load("http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg")
                .thumbnail(thumbail)
                .into(iv_8);

所不同的是,第一个缩略图请求是完全独立于第二个原始请求的。该缩略图可以是不同的资源或图片 URL,你可以为其应用不同的转换,等等。



3.Glide 中的回调:Targets

概述:前面所讲的在into()里设置ImageVeiw,试想一下,如果这将不是最后一步,可以在into()里设置Targets的方式去接受图片资源的Bitmap。Targets 是没有任何别的回调,它在 Glide 做完所有的加载和处理之后返回结果。

private SimpleTarget simpleTarget = new SimpleTarget<Bitmap>(200,200) {
            @Override
            public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                iv_9.setImageBitmap(resource);
            }
        };
        tv_title9.setText("Glide 中的回调:Targets");
        Glide.with(this)
                .load("http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg")
                .asBitmap()
                .into(simpleTarget);
  • 从代码中我们可以看到,使用了asBitmap()方法,主要是因为后台返回的资源地址,有GIF等多种类型,而SimpleTarget参数类型是Bitmap类型。所以要把Glide加载的图片资源强制转换成asBitmap()资源。
  • 根据JAVA/android语法规定,允许init()方法里去使用匿名内部类。Glide在请求加载图片之前,在手机内存较低的情况下,会导致Android垃圾回收机制移除了匿名内部类。当图片加载成时,就不会再去回调该方法。所以我们要保证把simpleTarget声明成一个字段对象,这样就可以防止被Android垃圾回收机制移除。
  • 第二个关键部分是 Glide 建造者中这行:with(context)。 这里的问题实际是 Glide 的功能:当你传了一个 context,例如是当前应用的 activity,Glide 将会自动停止请求当请求的 activity 已经停止的时候。这整合到了应用的生命周期中通常是非常有帮助的,但是有时工作起来是困难的,如果你的 target 是独立于应用的 activity 生命周期。这里的解决方案是用 application 的 context: .with(context.getApplicationContext))。当应用资深完全停止时,Glide 才会杀死这个图片请求。请求记住,再说一次,如果你的请求需要在 activity 生命周期之外去做时,才用下面这样的代码:
Glide.with(getApplicationContext))
                .load("http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg")
                .asBitmap()
                .into(simpleTarget);

当然可能有人再问,如果我想设置ImageView大小。这我Glide已经有解决方法,Target是可以指定尺寸。使用方法,看上面的代码。具体看源码。

ViewTarget自定义视图

这个主要是用在自定义View,比如我们程序中有一个组合自定义控件,里面有ImageView需要我们设置。这个时候用ViewTarget更容易实现。

FutureStudioView studioView = (FutureStudioView) findViewById(R.id.custom_view);
        ViewTarget viewTarget = new ViewTarget<FutureStudioView, GlideDrawable>(studioView) {

            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                this.view.setImage(resource.getCurrent());
               this.view.setText(String.valueOf(resource.getCurrent()));
            }
        };
        Glide.with(this)
                .load("http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg")
                .into(viewTarget);

认真研究,你会发现,我们还可以在ViewTarget里面去给TextView设置值。具体自己去测试吧。

加载图片到Notifications

见名知意,就是通知栏图标嘛。Glide还提供了方便舒适的方式:NotificationTarget。我们用效果图说话吧。

模拟器不是特别美观,讲究这看下。也别太在意这些细节。具体代码会有下载地址。

DEMO地址请自行下载

时间: 2024-10-27 13:31:21

Glide简单使用(二)的相关文章

ZabbixAPI+django+nginx简单的二次开发实例(三)

接上一篇博文 ZabbixAPI+django+nginx简单的二次开发实例(二) 步骤三,站点架构部分 本部分用到的软件 1,Nginx:接受访问请求,应答静态页面,转发动态请求至uwsgi 2,uwsgi:应答动态请求 3,Django:处理后台数据 4,supervisor:管理进程 首先安装Nginx yum install epel-release yum install python-devel nginx 修改配置文件 vim /etc/ngnix/ngnix.conf user

调用MyFocus库,简单实现二十几种轮播效果

一.首先点击这里下载myFocus库文件,标准文件库就行了,很小仅仅1.4M. myFocus库有以下的好处: a . 文件小巧却高效强大,能够实现二十几种轮播的效果. b . 极其简单的使用,只需要调用就可以使用,下面会介绍方法. c . 灵活的设置,很多参数可以提供设置,比如不想要文字提示,设置高度为0....更多参数适用请见网站教程页面. 二.下载下来之后,解压,看到一个文件夹,如下图所示: 对此文件夹进行一下说明:a . 打开js文件夹,然后有个js文件,就是我们最开始要调用的myfoc

若干排序算法简单汇总(二)

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/36706131 作者:小马 一希尔排序 上一篇讲到的直接插入排序,时间复杂度O(n^2). 请在脑海里想一下它的过程.如果一个序列本来就是有序的,对它排序的时间复杂度是O(n).所以当序列基本有序时,插入排序排序的效率大大提高,因为减少了移动的动作. 另外,直接插入排序还有一个特点,当n比较小时,它的效率比较高. 希尔排序正是基于上面两个思想做的一种改进算法.它先将整个序列分成若干

ZabbixAPI+django+nginx简单的二次开发实例(五)

接上一篇博文 ZabbixAPI+django+nginx简单的二次开发实例(四) 步骤五,图形展示 写一个RRDtool图形展示的脚本,由于要和view.py联动,我放在了appname的文件夹下 cd /API/web/pos/moniter vim rrddraw.py #!/usr/bin/env python #coding=utf-8 import rrdtool #ping的图形 def itemping(data): pngname = str(data['pname']) #图

Redis入门很简单之二【常见操作命令】

Redis入门很简单之二[常见操作命令] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存 Redis提供了丰富的命令,允许我们连接客户端对其进行直接操作.这里简单介绍一下作为常用的一些命令,包括对字符串.列表.集合.有序集合.哈希表的操作,以及一些其他常用命令. [ 基本操作] 1. 添加记录:通常用于设置字符串(string)类型,或者整数类型:如果key已经存在,则覆盖其对应的值. Shell代码   set name James 2. 获取记录:通过键获取值.

Android自定义用户控件简单范例(二)

对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应该写成一个类,而这个类的属性是是有自己来决定的. 我们要在res/values目录下建立一个attrs.xml的文件,并在此文件中增加对控件的属性的定义. 使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来. 在自定义控件类中使

正则表达式--简单记忆二

全部符号解释 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配 "\" 而 "\(" 则匹配 "(". ^ 匹配输入字符串的开始位置.如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置. $ 匹配输入字符串的结束位置.如果设置了RegExp

【sql注入】简单实现二次注入

[sql注入]简单实现二次注入 本文转自:i春秋社区 测试代码1:内容详情页面 [PHP] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?php     include('./connect.php'); //引入数据库配置文件     $id=$_GET['id'];     $select_sql="SELECT * FROM article WHERE title='

把简单的二维数组变成一维数组

在工作中我们经常需要把二维数组变成一维数组.那么就需要循环拿出来,其实有时候我们可以使用一些小技巧,借助php的内置函数来实现,但是我说的只是简单的二维数数组$arr= array('name'=>array('a'=>'abc','b'=>'bcd','c'=>'cde'));如果我们使用array_pop(),就可以拿到一维数组了,array_pop()本来是删除并返回数组的最后一个元素. 所以我们就可以将上诉的$arr变成array('a'=>'abc','b'=>

C++动态数组简单模拟二叉堆

//C++动态数组简单模拟二叉堆 #include<iostream> using namespace std; class BinaryHeap { private: int cap; //数组最大容量 int size; //当前元素个数 int* datas; //数组首地址 public: explicit BinaryHeap(int cap_) :cap(cap_), size(0) { datas = new int[cap]; } ~BinaryHeap(){ delete d