在Android Glide中离线时如何加载已经获取的图片

7

我正在使用Glide 4.8.0版本。

用以下方式加载图片:

GlideApp
    .with(HomePageFragment.this)
    .load(remoteURL)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(mImageView);

当设备连接到互联网时,图像可以成功加载,但当设备处于离线状态时,如何从缓存中加载已经从远程URL获取的相同图像?
我的CustomAppGlideModule看起来像这样。
@GlideModule
public class CustomAppGlideModule extends AppGlideModule {

    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        builder.setMemoryCache(new LruResourceCache(20 * 1024 * 1024));
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));
    }

}

我也尝试了

.onlyRetrieveFromCache(true)

但这也无法帮助。

请尝试使用Glide.with(mContext).load(url).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView)。 - aanshu
使用 SOURCE 代替 DiskCacheStrategy.ALL - aanshu
1个回答

8

方案1:使用DiskCacheStrategy.SOURCE而不是DiskCacheStrategy.ALL,因为DiskCacheStrategy.SOURCE可以将原始数据保存到缓存中。

//Version 4.x
GlideApp
    .with(HomePageFragment.this)
    .load(remoteURL)
    .diskCacheStrategy(DiskCacheStrategy.DATA)
    .into(mImageView);

//Version 3.x
Glide.with(mContext)
   .load(url)
   .diskCacheStrategy(DiskCacheStrategy.SOURCE)
   .into(imageView);

选项2:(如果上述选项不起作用)

使用Glide的特定原因是什么?你是否想尝试一下Picasso呢?我发现在这方面Picasso更好。你可以使用以下代码进行离线缓存。如果没有找到,它将首先从离线缓存中提供图片,然后再搜索在线图片。

Picasso.with(getActivity())
.load(imageUrl)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(imageView, new Callback() {
    @Override
    public void onSuccess() {
      //..image loaded from cache
    }

    @Override
    public void onError() {
        //Try again online if cache failed
        Picasso.with(getActivity())
                .load(posts.get(position).getImageUrl())
                .error(R.drawable.header)
                .into(imageView, new Callback() {
            @Override
            public void onSuccess() {
              //... image loaded from online
            }

            @Override
            public void onError() {
                Log.v("Picasso","Could not fetch image");
            }
        });
    }
});

谢谢你的回答,实际上我找到了错误,它在其他地方。是的,我使用Glide,因为它不需要调整图像大小以进行centerCrop(),并且还提供许多其他内置设施。最重要的是它的缓存机制。 - kanudo
哦,感谢分享知识。您能否编辑答案,加入您找到的解决方案,以使这个问题对其他人有所帮助。如果您觉得有用,请点赞。 - aanshu

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