当前位置:首页 » 安卓系统 » glidewithandroid

glidewithandroid

发布时间: 2023-01-30 04:12:06

‘壹’ Android Glide(二)生命周期感知

主要分为三个层次的生命周期:Activity & 网络 & 内存。
我们一般认为,应该及时取消不必要的加载请求,这很耗费资源,但在Glide这并不是必须的操作。因为 Glide 会在页面生命周期 / 网络变化时,自动取消加载或重新加载。没错,就是这么牛逼。

还记得Glide使用的第一句吗,Glide.with(参数),
with()方法可以接收Context、Activity或者Fragment类型的参数。

先说结论,根据传入的参数不同,将对应于 Application & Activity & Fragment 的作用域,具体如下:

这里不细节分析源码实现,我们只需要知道,不同参数通过重载方法,作用于不同的作用域

这里具体分析一下上面这些晦涩的语句,注意设计的思路重点,就是这个SupportRequestManagerFragment,这个隐藏SupportRequestManagerFragment,这个并不可见的SupportRequestManagerFragment。

Glide并没有办法知道Activity的生命周期,于是Glide就使用了添加隐藏Fragment的这种小技巧,相当于通过这个隐藏的fragment与对应的Activity建立了联系,因为Fragment的生命周期和Activity是同步的,如果Activity被销毁了,Fragment是可以监听到的,这样Glide就可以捕获这个事件并停止图片加载了。

这是 为了避免 SupportRequestManagerFragment 在一个作用域中重复创建。
因为commitAllowingStateLoss()是将事务 post 到消息队列中的,也就是说,事务是异步处理的,而不是同步处理的。假设没有临时保存记录,一旦在事务异步等待执行时调用了Glide.with(...),就会在该作用域中重复创建 Fragment。

从上面的分析我们得知,Glide 为每个Activity 和 Fragment 作用域创建了一个无界面的 Fragment,这里我们就来分析 Glide 如何监听这个无界面 Fragment 的生命周期。
首先先提到一个概念,Lifecycle,大家可以粗略的把它理解为 移动APP页面的状态
其实说起来也是三步走战略,
1、在创建Fragment的时候会创建ActivityFragmentLifecycle对象;
2、在Fragment生命周期的方法中会调用Lifecycle的相关方法来通知RequestManager;
3、LifecycleListener 是一个接口,RequestManager实现了这个接口,Lifecycle最终是调用了lifecycleListener来通知相关的实现类的,也就是RequestManager。

这个就非常简单了,也就是上述的RequestManager实现了LifecycleListener接口后,在对应的方法中,作出相应的处理。
主要关注以下几点:

这个逻辑很简单,在刚才所说的RequestManager的构造器中,会构建一个ConnectivityMonitor对象,它的默认构造工厂是,如果有网络监听权限,
则实例化DefaultConnectivityMonitor,在onStart()时注册广播监听器,而在onStop()时注销广播监听器。在RequestManager中根据网络状态进行相应的操作。

听起来有点拗口,简而言之,如果应用有监控网络状态的权限,那么 Glide 会监听网络连接状态,在页面可见时注册广播监听器,而在页面不可见时注销广播监听器,并在网络重新连接时重新启动失败的请求。

这个的实现也非常简单的的,在构建 Glide 时,会调用registerComponentCallbacks()进行全局注册, 系统在内存紧张的时候回调onTrimMemory(level)。
而 Glide 则根据系统内存紧张级别(level)进行相应的回收,而 RequestManager 在 TRIM_MEMORY_MODERATE 级别会暂停请求。

‘贰’ Android之 glide 框架 解读

glide图片加载框架 其目的帮助我们在开发过程中对控件上的图片加载减压,它能够通过参数和方法加载 本地图片 网络图片 二进制等到控件上 还能够设置预加载以及加载出错时的错误提示图片,还能够对加载的图片进行缓存重复利用 可以缓存原始照片还能缓存经过压缩处理后的照片,能够缓存到内存,或者硬盘,甚至glide可以加载GIF动图还可以给加载的静态图片指定大小,对于 glide的缓存机制它用的是lru 这种缓存机制 其实就是 在一定缓存空间内把最近用的以及重复用的排列在最高级 将最不常用没有重复使用的排在最低级 当有新实例出现,缓存空间不够用的情况下就会把被打有最低级标志的实例释放掉。

‘叁’ android glide只能缓冲缩略图吗

lide是一个快速高效的Android媒体管理框架,将媒体解码、内存和硬盘缓存、资源池包装成简单和易于使用的接口。Glide支持获取、解码和显示视频文件、图片和动画GIF文件。包含了一个灵活的API,借助以API开发者能够将Glide应用到大多数的网络协议栈中。

‘肆’ android glide 怎么设置只有一个圆角

附录1简单介绍了android开源的图片加载框架。在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide在加载过程中就把矩形图转换成圆形的,则需要在Glide之上引入一个开源项目:glide-transformations
glide-transformations在github上的项目主页是:https://github.com/wasabeef/glide-transformations
写一个例子说明。

[java] view plain
package zhangphil.app;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

import com.bumptech.glide.Glide;

import jp.wasabeef.glide.transformations.BlurTransformation;
import jp.wasabeef.glide.transformations.CropCircleTransformation;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;

public class MainActivity extends AppCompatActivity {

//我csdn博客头像
String url = "http://avatar.csdn.net/9/7/A/1_zhangphil.jpg";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//原图,是我博客的头像
ImageView image1 = (ImageView) findViewById(R.id.image1);
Glide.with(this).load(url).crossFade(1000).into(image1);

//原图 -> 圆图
ImageView image2 = (ImageView) findViewById(R.id.image2);
Glide.with(this).load(url).bitmapTransform(new CropCircleTransformation(this)).crossFade(1000).into(image2);

//原图的毛玻璃、高斯模糊效果
ImageView image3 = (ImageView) findViewById(R.id.image3);
Glide.with(this).load(url).bitmapTransform(new BlurTransformation(this, 25)).crossFade(1000).into(image3);

//原图基础上复合变换成圆图 +毛玻璃(高斯模糊)
ImageView image4 = (ImageView) findViewById(R.id.image4);
Glide.with(this).load(url).bitmapTransform(new BlurTransformation(this, 25), new CropCircleTransformation(this)).crossFade(1000).into(image4);

//原图处理成圆角,如果是四周都是圆角则是RoundedCornersTransformation.CornerType.ALL
ImageView image5 = (ImageView) findViewById(R.id.image5);
Glide.with(this).load(url).bitmapTransform(new RoundedCornersTransformation(this, 30, 0, RoundedCornersTransformation.CornerType.BOTTOM)).crossFade(1000).into(image5);
}
}

布局则比较简单,是一个垂直方向的线性布局布局了5个ImageView,不再赘述。

代码运行结果。

附录:

1,《Android图片加载与缓存开源框架:Android Glide》链接:http://blog.csdn.net/zhangphil/article/details/45535693

‘伍’ glide4.0以上在Android9.0以上加载图片不显示解决方案

楼主当时做项目的时候,用了glide加载网络图片,当时在Android9.0以下的手机都是显示正常的

在9.0以上发现只显示glide默认的图片 ,于是网络了,找到了答案。在这里记一下

解决方案很简单,在AndroidManifest.xml文件里, application字段里 加入  android:usesCleartextTraffic="true" 就可以了,图片就会正常显示

‘陆’ Android 图片及文字模糊效果

implementation'com.github.bumptech.glide:glide:4.7.1'

implementation'jp.wasabeef:glide-transformations:4.0.1'

Glide.with(this).load(url)

.apply(RequestOptions.bitmapTransform(new BlurTransformation(5,2)))

.into(civ);

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){

//View从API Level 11才加入setLayerType方法 //设置View以软件渲染模式绘图

    tvPhone.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

}

SpannableString stringBuilder=new SpannableString("文字模糊");

stringBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(10f,BlurMaskFilter.Blur.NORMAL)),

0,stringBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

tvPhone.setText(stringBuilder);

最后来张效果图吧:

‘柒’ Android开发Glide用过的人多吗

应该很多,方便,一句代码就搞定,还能自带多种效果,只用给个地址就行,
Glide.with(mContext).load(MyApplication.BASE_URL+"/photos/"+
newslist.get(position-1).getNewsImage1())//地址
.error(R.drawable.needimage)//出错时显示
.placeholder(R.drawable.loading2)//加载时显示
.override(50, 50).into((ImageView)holder.newsimage);//哪个控件需要加载,还有淡入淡出之类的。

‘捌’ Glide使用

占位符和渐现动画
Glide 的流式接口只需要调用 .placeHolder()用一个 drawable(resource) 引用,Glide 将会显示它作为一个占位符,直到你的实际图片准备好。

不能设置一个网络 url 作为占位符,因为这也会被去请求加载的。App 资源和 drawable 能保证可用和可访问的。然而,作为 load()方法的参数,Glide 接受所有值。

当App 尝试从一个网站去加载一张图片,但由于某些原因加载失败,使用错误占位符:.error(),在大多数情况下使用占位符,来指明图片不能被加载已经足够了。

error()接受的参数只能是已经初始化的 drawable 对象或者指明它的资源。

Glide 使用标准的淡入淡出动画,这是默认激活的。如果你想要如强制 Glide 显示一个淡入淡出动画,你必须调用另外一个建造者:

crossFade()方法还有另外重载方法 .crossFade(int ration)。如果你想要去减慢(或加快)动画,随时可以传一个毫秒的时间给这个方法。动画默认的持续时间是 300毫秒。

用 resize(x,y) 调整图片大小
Glide 自动限制了图片的尺寸在缓存和内存中,并给到 ImageView需要的尺寸。如果图片不会自动适配到 ImageView,调用 override(horizontalSize, verticalSize) 。这将在图片显示到 ImageView之前重新改变图片大小。

当你还没有目标 view 去知道尺寸的时候,这个选项也可能是有用的。比如,如果 App 想要在闪屏界面预热缓存,它还不能测量 ImageView的尺寸。然而,如果你知道这个图片多少大,用 override 去提供明确的尺寸。

缩放图像

显示 Gif
检查图片加载的是否是一个gif图片,调用一个额外的防区强制 Glide变成一个 Gif asGif()

如果这个 gifUrl 不是一个 Gif,.error()回调被调用并且错误占位符被显示。

Gif 转为 Bitmap
如果你仅仅想要显示 Gif 的第一帧,你可以调用 asBitmap()去保证其作为一个常规的图片显示,即使这个 URL 是一个 Gif。

内存缓存
Glide 通过使用默认的内存和磁环缓存去避免不必要的网络请求。调用了 .skipMemoryCache(true)去明确告诉 Glide 跳过内存缓存。可以用 .diskCacheStrategy()方法为 Glide 改变磁盘缓存的行为,如果要为一个请求禁用磁盘缓存。使用枚举 DiskCacheStrategy.NONE。
作为参数。

Glide 缓存了原始图像,全分辨率图像和另外小版本的图像。对于 .diskCacheStrategy()方法来说不同的枚举参数的意义:

如果有一张图片,将会经常操作处理,并做了一堆不同的版本,对其有意义的仅仅是缓存原始分辨率图片,用 DiskCacheStrategy.SOURCE。

图片请求的优先级
Priority (优先级)枚举

你正在实现一个信息详情页面,有一个英雄图片在顶部,和较小的图片在底部。对于最好的用户体验来说,英雄图片首先需要被加载。因此,我们用 Priority.HIGH
来处理它。理论上说,这应该够了,但是为了让这个实例增加点趣味,我们也将底层图像分配给低优先级,用 .priority(Priority.LOW)
调用:

缩略图
用原图的1/10作为缩略图

用其它图片作为缩略图

Glide 中的回调:Targets
Glide 提供了一个用 Targets的简单的方式去接受图片资源的 Bitmap。Targets 是没有任何别的回调,它在 Glide 做完所有的加载和处理之后返回结果。

不能使用常规的 Glide 的方法 .into(),因为我们的自定义 view 并不继承自 ImageView。因此,我们必须创建一个 ViewTarget,并用 .into()方法:

创建一个自定义通知

上述创建了三个重要的对象,notification和 RemoteViews以及常量 NOTIFICATION_ID。利用这些去创建一个通知 target。

调用 Glide,将 target 作为 .into()的参数。

Transformations(转换)
在图片被显示之前,transformations(转换) 可以被用于图像的操作处理。图片的任意属性:颜色、尺寸、范围、颜色、像素位置等等。下面的库它为 Glide 转换提供了多种多样的实现:
glide-transformations

用 animate() 自定义动画
创建自己的 XML 动画,比如一个小的缩放动画,图片刚开始小的,然后逐渐增大到原尺寸。

这两个动画可以添加到Glid中

在 AndroidManifest.xml的 <application>标签内去声明这个刚刚创建的 Glide mole。

android:name属性是包名+类名的形式。
要看第一个方法applyOptions(Context context, GlideBuilder builder),可以在这个方法里去调 GlideBuilder中可用的方法。

参考:
Glide系列教程

热点内容
linux命令全称 发布:2024-05-17 12:07:54 浏览:110
ftpnas区别 发布:2024-05-17 12:06:18 浏览:949
512g存储芯片价格 发布:2024-05-17 12:04:48 浏览:963
脚本运行周期 发布:2024-05-17 11:39:09 浏览:808
阿里云服务器怎么配置发信功能 发布:2024-05-17 11:37:24 浏览:313
编程中的变量 发布:2024-05-17 11:33:06 浏览:777
加密视频怎么解密 发布:2024-05-17 11:02:52 浏览:571
柳工挖机密码多少合适 发布:2024-05-17 11:00:40 浏览:188
android工程叹号 发布:2024-05-17 10:56:21 浏览:481
在苹果手机应用怎么比安卓贵 发布:2024-05-17 10:56:20 浏览:548