Glide-4.0.0缺少占位符、错误,GlideApp无法解决其方法placeholder和error。

91

我想使用Glide Android库下载图片并显示在ImageView中。

在之前的版本中,我们使用了:

Glide.with(mContext).load(imgUrl)
                .thumbnail(0.5f)
                .placeholder(R.drawable.PLACEHOLDER_IMAGE_NAME)
                .error(R.drawable.ERROR_IMAGE_NAME)
                .crossFade()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imageView);

但我看过Glide的文档:

文档中建议使用GlideApp.with()代替Glide.with()

我的担忧是缺失占位符、错误、GlideApp以及其他选项。

我正在使用:

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

我做错了什么?参考这里

GlideApp.with()如何使用?

API与AppGlideModule位于同一包中,默认命名为GlideApp。应用程序可以通过始终使用GlideApp.with()而不是Glide.with()来启动所有加载:

GlideApp.with(fragment)
   .load(myUrl)
   .placeholder(placeholder)
   .fitCenter()
   .into(imageView);

1
可能是 Glide v4 中的占位符/错误/回退 的重复问题。 - Oussema Aroua
2
你了解GlideApp吗?如何使用以及何时使用?如果不了解,请点赞。 - Ritesh Bhavsar
你错过了第二步,请查看:http://bumptech.github.io/glide/doc/generatedapi.html - Oussema Aroua
请按照此文档 bumptech.github.io/glide/doc/getting-started.html#applicatio‌​ns 进行操作。 - Rohan Pawar
8个回答

231

尝试使用RequestOptions

RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(R.drawable.ic_placeholder);
requestOptions.error(R.drawable.ic_error);

Glide.with(context)
     .setDefaultRequestOptions(requestOptions)
     .load(url).into(holder.imageView);

编辑

如果 .setDefaultRequestOptions(requestOptions) 不起作用,请使用 .apply(requestOptions)

Glide.with(MainActivity.this)
            .load(url)
            .apply(requestOptions)
            .into(imageview);
 // or this
 Glide.with(MainActivity.this)
            .load(url)
            .apply(new RequestOptions().placeholder(R.drawable.booked_circle).error(R.drawable.booked_circle))
            .into(imageview);

 // or this
 Glide.with(MainActivity.this)
            .load(url)
            .apply(RequestOptions.placeholderOf(R.drawable.booked_circle).error(R.drawable.))
            .into(imageview);

编辑2:奖励内容

以下是Glide-4中的一些其他更改:


我也不知道 @RiteshBhavsar,但在我的设备上使用新的Glide库可以正常工作,你可以检查一下。 - AskNilesh
@NileshRathod RequestOptions 应该使用构建器样式:RequestOptions requestOptions = new RequestOptions().placeholder(R.drawable.ic_placeholder).requestOptions.error(R.drawable.ic_error); - Alexander Ukhov
1
这是一种没有GlideApp的解决方法。请参阅https://github.com/bumptech/glide/issues/1945以了解如何添加GlideApp。 - CoolMind
有没有办法获取类似于 Bitmap bitmap = Glide 输出的位图输出? - Vipul Chauhan
ic_placeholder 是红色的,编译器无法识别它。 - fluffykitten
@fluffykitten 你需要提供可绘制资源ID,而不是使用ic_placeholder作为占位符。 - AskNilesh

34

如果你使用Glide软件包依赖项compile 'com.github.bumptech.glide:glide:3.7.0',那么应该使用以下代码:

如果您使用 Glide 软件包依赖项 compile 'com.github.bumptech.glide:glide:3.7.0',则应该使用以下代码:

GlideApp
    .with(your context)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_image)
    .error(R.drawable.error_image)
    .into(myImageView);

注意:文档中一样,圆形图片:CircleImageView / CircularImageView / RoundedImageView已知与TransitionDrawable(.crossFade()与.thumbnail()或.placeholder())和动态GIF存在问题,使用BitmapTransformation(.circleCrop()将在v4中可用)或.dontAnimate()来解决此问题。

最新更新版本compile com.github.bumptech.glide:glide:4.1.1,然后使用以下代码:

RequestOptions options = new RequestOptions()
                    .centerCrop()
                    .placeholder(R.drawable.default_avatar)
                    .error(R.drawable.default_avatar)
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .priority(Priority.HIGH)
                    .dontAnimate()
                    .dontTransform();

Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);

查看最新版本的Glide,包括错误修复和功能更新


Glide是一个非常奇怪的库,使用起来很困难,他们在GitHub上也没有更新。 - Anand Savjani
嘿,@AnandSavjani,他们没有在GitHub上更新,但你可以在这个链接中找到他们的更新: https://github.com/bumptech/glide/releases - ND1010_
1
如果你不喜欢 Glide,那么你可以创建自己的方式来加载图片和 GIF,并提供缓存功能。你可以自由地将它上传到 GitHub 并随时更新。 - ND1010_

11

如果您想使用GlideApp,您需要像截图中那样将dependencies的注释处理器添加进去:

如何将GlideApp添加到您的项目中

然后在您的应用程序中包含一个AppGlideModule实现:

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}

不要忘记使用@GlideModule注释。 然后需要构建项目。这样GlideApp将会自动生成。


1
同步gradle后它没有工作。但是我们需要重新构建才能使其工作。 - Ravi Yadav

7
我们不需要使用RequestOptions。
生成的API添加了一个GlideApp类,该类提供对RequestBuilder和RequestOptions子类的访问。 RequestOptions子类包含RequestOptions中的所有方法以及GlideExtensions中定义的任何方法。 RequestBuilder子类提供对生成的RequestOptions子类中的所有方法的访问,而无需使用apply:
使用Glide:-
没有生成的API的请求可能看起来像这样:
Glide.with(fragment)
    .load(url)
    .apply(centerCropTransform()
        .placeholder(R.drawable.placeholder)
        .error(R.drawable.error)
        .priority(Priority.HIGH))
    .into(imageView);

使用 GlideApp:
通过生成的API,可以将RequestOptions调用内联化:
GlideApp.with(fragment)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .priority(Priority.HIGH)
    .into(imageView);

您仍然可以使用生成的RequestOptions子类将相同的选项应用于多个负载,但在大多数情况下,生成的RequestBuilder子类可能更加方便。

6

依赖项:

compile 'com.github.bumptech.glide:glide:4.1.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'

添加一个适当注释的AppGlideModule实现:
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;

@GlideModule
public final class MyAppGlideModule extends AppGlideModule{}

除此之外,如果您使用了jack选项,请使用Android Studio 3.0.0预览版以避免以下类似错误。

错误:执行任务':app:transformJackWithJackForDebug'失败。com.android.jack.ir.JNodeInternalError:java.lang.Exception:java.lang.AssertionError:尚未实现


4

工作中

Glide.with(context!!)
     .load(user.profileImage)
     .apply (RequestOptions.placeholderOf(R.drawable.dummy_user))
     .into(edit_profile_image)

2
如果您想在应用程序中的任何地方使用通用占位符,则可以按照以下方式操作:
由于我们正在从Glide v4创建GlideModule,因此您可以将此类复制/粘贴到您的项目中,以便您可以使用GlideApp类(有关更多步骤,请参见此处)。
@GlideModule
public class SampleGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        super.applyOptions(context, builder);
        builder.setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo).error(R.drawable.logo));
    }

    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
        super.registerComponents(context, glide, registry);
    }
}

您可以在此处提供所有请求选项以设置为默认值

通过创建此类,您无需使用.placeholderGlideApp,它将自动应用。


1
RequestOptions options = new RequestOptions()
            .placeholder(R.drawable.null_image_profile)
            .error(R.drawable.null_image_profile);
    //.centerCrop()
    //.diskCacheStrategy(DiskCacheStrategy.ALL)
    //.priority(Priority.HIGH);

    Glide.with(context).load(imageUrl)
            .apply(options)
            .into(profileImage);

1
请添加一些说明 - 仅有代码块并不是所有的信息。 - CertainPerformance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接