增加Glide图片加载超时时间

19

我正在使用Glide从URL加载图片。当我获取图片时,我在ImageView中显示一个加载器。一些被获取的图片较大,因此在慢速互联网连接下会超时并抛出异常。

如何增加超时时间?


你是否尝试使用 OK HTTP 代替 Volley?可以参考这里的说明:https://github.com/bumptech/glide/wiki/Integration-Libraries#okhttp - alexislg
5个回答

14
您可以在Glide的新版本中使用此方法。
.timeout(60000)

最终的代码示例将是:

Glide.with(imageView.getContext())
        .load(finalUrl)
        .timeout(60000)
        .placeholder(R.drawable.place_holder)
        .into(imageView);

11

以下是解决方案:Glide 4.3.1OkHttp 3.9.1,与以前的略有不同(不再使用OkHttpGlideModule而是AppGlideModule)。

build.gradle

implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'com.github.bumptech.glide:glide:4.3.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1'
implementation 'com.github.bumptech.glide:okhttp3-integration:4.3.1'

自定义Glide模块

@GlideModule
public class CustomGlideModule extends AppGlideModule {

    @Override
    public void registerComponents(Context context, Glide glide, Registry registry) {
        final OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.readTimeout(YOUR_CUSTOM_TIMEOUT, TimeUnit.SECONDS);
        builder.writeTimeout(YOUR_CUSTOM_TIMEOUT, TimeUnit.SECONDS);
        builder.connectTimeout(YOUR_CUSTOM_TIMEOUT, TimeUnit.SECONDS);
        registry.append(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(builder.build()));
    }

}

10

如果您想使用OkHttp,请根据这里的说明导入glide:okhttp-integration,然后实现您自己的OkHttpGlideModule

@GlideModule
public class CustomGlideModule extends OkHttpGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // stub
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        final OkHttpClient.Builder builder = new OkHttpClient.Builder();

        // set your timeout here
        builder.readTimeout(30, TimeUnit.SECONDS);
        builder.writeTimeout(30, TimeUnit.SECONDS);
        builder.connectTimeout(30, TimeUnit.SECONDS);

        glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(builder.build()));
    }
}

10

经过多次搜索终于找到了答案,如果你正在使用Volley:

public class CustomGlide implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        RequestQueue queue = new RequestQueue( // params hardcoded from Volley.newRequestQueue()
                new DiskBasedCache(new File(context.getCacheDir(), "volley")),
                new BasicNetwork(new HurlStack())) {
            @Override public <T> Request<T> add(Request<T> request) {
                request.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1));
                return super.add(request);
            }
        };
        queue.start();
        glide.register(GlideUrl.class, InputStream.class, new VolleyUrlLoader.Factory(queue));
    }
}

根据您的需求更改DefaultRetryPolicy,并在清单文件中进行如下设置:

 <meta-data
            android:name="<package-name>.CustomGlide"
            android:value="GlideModule" />

我已经按照您的要求声明了customGlide类,但现在如何在Java类中使用它来加载图像? - Dharmishtha
1
现在glide已经配置了您提供的超时时间。只需要使用Glide.with(context).load(url).into(ImageView)请求图像即可。 - Karthik K M
2
对于 VolleyUrlLoader,您需要添加以下内容:compile 'com.github.bumptech.glide:volley-integration:1.5.0@aar' 到您的依赖项中。 - The Dude
为了避免与Gradle自动添加到合并清单中的VolleyGlideModule发生冲突,您必须手动排除它,方法是添加另一个元数据条目:<meta-data android:name="com.bumptech.glide.integration.volley.VolleyGlideModule" tools:node="remove" /> - knezmilos
@knezmilos 在 VolleyUrlLoader 的编译过程中,它向我显示了未解决的超类型错误。 - Zicsus

5
.timeout(30000)

最简单的方法是:

Glide.with(this)
         .setDefaultRequestOptions(new RequestOptions()
         .timeout(30000))
         .load("https://stackoverflow.com/posts/58063088/edit")
         .placeholder(getResources().getDrawable(R.drawable.no_image))
         .error(getResources().getDrawable(R.drawable.no_image))                
         .into(imageView);

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