美文网首页
Glide v4使用指南

Glide v4使用指南

作者: suym | 来源:发表于2018-01-14 20:01 被阅读237次

    Glide v4使用指南

    Android SDK 要求

    Min Sdk Version - 使用 Glide 需要 min SDK 版本 API 14 (Ice Cream Sandwich) 或更高。

    Compile Sdk Version - Glide 必须使用 API 26 (Oreo) 或更高版本的 SDK 来编译。

    Support Library Version - Glide 使用的支持库版本为 27。

    如果你需要使用不同的支持库版本,你需要在你的 build.gradle 文件里去从 Glide 的依赖中去除 "com.android.support"。例如,假如你想使用 v26 的支持库:

    depdendencies {

    implementation ("com.github.bumptech.glide:glide:4.4.0") {

    exclude group: "com.android.support"

    }

    implementation "com.android.support:support-fragment:26.1.0"

    }

    Gradle配置:

    dependencies {

    compile 'com.github.bumptech.glide:glide:4.4.0'

    annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'

    }

    权限:

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

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

    从技术上讲,ACCESS_NETWORK_STATE 对于 Glide 加载 URL 并不是必需的,但是它将帮助 Glide 处理 片状网络(flaky network) 和飞行模式。

    你可以通过检查 ConnectivityMonitor 日志标签来验证 Glide 是否正在监听网络状态:

    adb shell setprop log.tag.ConnectivityMonitor DEBUG

    本地存储 (Local Storage)

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

    Proguard

    如果你有使用到 proguard,那么请把以下代码添加到你的 proguard.cfg 文件中:

    -keep public class * implements com.bumptech.glide.module.GlideModule

    -keep public class * extends com.bumptech.glide.module.AppGlideModule

    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {

    **[] $VALUES;

    public *;

    }

    Kotlin

    如果你在 Kotlin 编写的类里使用 Glide 注解,你需要引入一个 kapt 依赖,以代替常规的 annotationProcessor 依赖:

    dependencies {

    kapt 'com.github.bumptech.glide:compiler:4.4.0'

    }

    请注意,你还需要在你的 build.gradle 文件中包含 kotlin-kapt插件:

    apply plugin: 'kotlin-kapt'

    基本用法

    多数情况下,使用Glide加载图片非常简单,一行代码足矣:

    Glide.with(fragment)

    .load(myUrl)

    .into(imageView);

    取消加载同样很简单:

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

    尽管及时取消不必要的加载是很好的实践,但这并不是必须的操作。实际上,当 Glide.with() 中传入的 Activity 或 Fragment 实例销毁时,Glide 会自动取消加载并回收资源。

    在 Application 模块中的使用

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

    package com.example.myapp;

    import com.bumptech.glide.annotation.GlideModule;

    import com.bumptech.glide.module.AppGlideModule;

    @GlideModule

    public final class MyAppGlideModule extends AppGlideModule {}

    生成的 API 默认名为 GlideApp ,与 AppGlideModule 的子类包名相同。在 Application 模块中将 Glide.with() 替换为 GlideApp.with(),即可使用该 API 去完成加载工作。

    GlideApp.with(fragment)

    .load(myUrl)

    .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 进行 null 检验并不是必须的,如果 url 为 null,Glide 会清空 View 的内容,或者显示 placeholder Drawable 或 fallback Drawable 的内容。

    Glide 唯一的要求是,对于任何可复用的 View 或 Target ,如果它们在之前的位置上,用 Glide 进行过加载操作,那么在新的位置上要去执行一个新的加载操作,或调用 clear() API 停止 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() 或 into(View),表明在此之前的加载操作会被取消,并且在方法调用完成后,Glide 不会改变 view 的内容。如果你忘记调用 clear(),而又没有开启新的加载操作,那么就会出现这种情况,你已经为一个 view 设置好了一个 Drawable,但该 view 在之前的位置上使用 Glide 进行过加载图片的操作,Glide 加载完毕后可能会将这个 view 改回成原来的内容。

    这里的代码以 RecyclerView 的使用为例,但规则同样适用于 ListView。

    非 View 目标

    除了将 Bitmap 和 Drawable 加载到 View 之外,你也可以开始异步加载到你的自定义 Target 中:

    Glide.with(context

    .load(url)

    .into(new SimpleTarget<Drawable>() {

    @Override

    public void onResourceReady(Drawable resource, Transition<Drawable> transition) {

    // Do something with the Drawable here.

    }

    });

    后台线程

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

    FutureTarget<Bitmap> futureTarget =

    Glide.with(context)

    .asBitmap()

    .load(url)

    .submit(width, height);

    Bitmap bitmap = futureTarget.get();

    // Do something with the Bitmap and then when you're done with it:

    Glide.with(context).clear(futureTarget);

    如果你不想让 Bitmap 和 Drawable 自身在后台线程中,你也可以使用和前台线程一样的方式来开始异步加载:

    Glide.with(context)

    .asBitmap()

    .load(url)

    .into(new Target<Bitmap>() {

    ...

    });

    相关文章

      网友评论

          本文标题:Glide v4使用指南

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