Android中图片加载框架Glide的使用

介绍

Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。
Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide的Api是如此的灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。

虽然Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快、更平滑,但实际上,Glide几乎能满足你对远程图片的拉取/缩放/显示的一切需求。

API

简单的使用,如下

Glide.with(content/acitivity)
        .load(url)
        .into(imageview)

性能

这里的性能测试结果都是从别人那里得到的,毕竟我也不是专业的测试人员

Glide 充分考虑了Android图片加载性能的两个关键方面:
- 图片解码速度
- 解码图片带来的资源压力
为了让用户拥有良好的App使用体验,图片不仅要快速加载,而且还不能因为过多的主线程I/O或频繁的垃圾回收导致页面的闪烁和抖动现象。
Glide使用了多个步骤来确保在Android上加载图片尽可能的快速和平滑:
- 自动、智能地下采样(downsampling)和缓存(caching),以最小化存储开销和解码次数;
- 积极的资源重用,例如字节数组和Bitmap,以最小化昂贵的垃圾回收和堆碎片影响;
- 深度的生命周期集成,以确保仅优先处理活跃的Fragment和Activity的请求,并有利于应用在必要时释放资源以避免在后台时被杀掉。

使用

dependencies {
  implementation ("com.github.bumptech.glide:glide:4.7.1") {
    exclude group: "com.android.support"
  }
  implementation "com.android.support:support-fragment:26.1.0"
}

我们需要在清单配置文件中申请网络权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

这里,如果是正在从URL加载图片,Glide可以自动帮助我们处理片状网络连接:他可以监听用户网络的连接状态,并且在我们重新连接网络重启之前失败的请求。如果Glide检测到我们有ACCESS_NETWORK_STATE权限,将自动实现,不需要额外的代码
我们可以通过检查ConnectivityMonitor日志标签来验证Glide是否正在监听网络状态。

同时我们可以申请本地存储权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

基本使用方法

多数情况下,Glide的加载图片很简单,

Glide.with(fragment)
        .load(url)
        .into(imageview);

取消加载的方式是

Glide.with(fragment).clear(imageview);

尽管及时取消不必要的加载是很好的实践,到那时并不是必须的操作,实际上在Activity或者Fragment被销毁的时候,Glide会自动去取消加载并且回收资源

在Application模块中的使用

在Application中,可以创建一个添加有@GlideModule注解,继承自AppGlideModule的类。此类可以生出一个流式Api,内联了多种选择,和集成库中自定义的选项,如下:

package com.niupule.myapp
 import com.bumptech.glide.annotation.GlideModule;
 import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public final class MyApp extends AppGlideModule{}

生成API默认名为GlideApp,与AppGlideModule的子类包名相同。那么我们可以使用下面的方式

GlideApp.with(fragment)
            .load(url)
            .placeholder(placeholder)
            .fitCenter()
            .into(imageview)

在ListView和RecyclerView中的使用

在ListView或者RecyclerView中加载图片和代码和在单独的View中加载是一样的。Glide已经自动处理了View的复用和请求的取消

@override
public void onBindViewHolder(ViewHolder holder,int position){
    String url = urls.get(position);
    Glide.with(fragment)
            .load(url)
            .into(holder.imageview);
}

对URL进行非空判断并不是必须的,因为url为null,Glide会清空View的内容,或者显示placeholder的内容或者法拉利back的内容
Glide唯一的要求是,对于任何复用的View或者Target,如果他们在之前的位置上,用Glide进行加载操作,那么在新的位置上要去执行一个新的加载操作,或调用clear()API停止Glide的工作。其实意思就是说之前如果用了Glide,则需要把之前的加载清除掉

@override
public void onBindViewHolder(ViewHolder holder,int position){
    if(isImagePosition(position)){
            String url = urls.get(position);
            Glide.with(fragment)
                    .load(url)
                    .into(holder.imageview);
    }else{
         Glide.with(fragment).clear(holder.imageview);
         holder.imageview.setImageDrawable(specialDrawable);
    }
}

对View进行clear()或者int(view),表明在此之前的加载操作会被取消,并且在方法调用之后,Glide不会改变View的内容,如果我们忘记调用clear()方法,有没有开启新的加载操作,那么就会出现这种情况,你已经为一个View设置好了Drawable,但该View在之前的位置上使用Glide进行过加载图片的操作,那么Glide加载完成之后可能会将View改成原来的内容。

非View目标

除了将Bitmap和Drawable加载到View之外,我们可以使用异步加载到自定义的Target中

Glide.with(context)
        .load(url)
        .into(new SimpleTarget<Drawable>(){
            @override
            public void onResourceReady(Drawable resource,Transition<Drawable> transition){
                    //执行的操作
        }
   });

后台线程

在后台线程加载图片也是可以直接使用submit(int ,int)

FutureTarget<Bitmap> futureTarget = 
    Glide.with(context)
            .asBitmap()
            .load(url)
            .submit(width,height);
Bitmap bitmap = futureTarget.get();
Glide.with(context).clear(futureTarget);

如果不想让Bitmap和Drawable自身在后台线程中,我们可以使用前台线程的方式开始异步加载

Glide.with(context)
        .asBitmap()
        .load(url)
        .into(new Target<Bitmap>(){
            //
    });

参考资料

Glide V4 图片加载框架

猜你喜欢

转载自blog.csdn.net/weixin_42580207/article/details/81506960