Android Studio中如何清理ImageSlider组件通过Glide加载的图片缓存
ImageSlider图片缓存问题解决方案
你使用的denzcoskun/ImageSlider库底层默认使用Glide加载图片,未直接暴露Glide缓存操作接口,可通过以下两种方案解决固定链接每日更新、但展示旧缓存图的问题:
方案1:配置自动过期缓存(推荐,无需主动清理)
通过自定义库的图片加载逻辑,给Glide添加每日更新的签名,实现当天复用缓存、次日自动拉取最新图,适配每日更新图片的场景:
- 调用库提供的
setImageLoadingListener方法重写加载逻辑,给Glide请求添加当日时间戳作为签名,只要日期变化,签名就会变化,Glide会自动跳过旧缓存拉新图 - 无需手动调用清理方法,适配性更高
示例代码:
imageSlider.setImageLoadingListener(new ImageLoadingListener() { @Override public void loadImage(ImageView imageView, String url, int position) { // 生成当日日期作为签名,同一天签名相同复用缓存,日期变化自动拉新 long dailySignature = System.currentTimeMillis() / (1000 * 60 * 60 * 24); RequestOptions options = new RequestOptions() .signature(new ObjectKey(dailySignature)) .diskCacheStrategy(DiskCacheStrategy.RESOURCE); // 可根据需求调整缓存策略 Glide.with(imageView.getContext()) .load(url) .apply(options) .into(imageView); } });
方案2:主动全局清理Glide缓存
如果需要手动触发缓存清理,直接调用Glide全局清理方法即可,和ImageSlider实例无关,清理后重新加载轮播图列表就会拉取最新图:
- 磁盘缓存清理必须在子线程执行,内存缓存可在主线程操作
示例代码:
new Thread(() -> { // 子线程清理磁盘缓存 Glide.with(getApplicationContext()).clearDiskCache(); runOnUiThread(() -> { // 主线程清理内存缓存 Glide.with(getApplicationContext()).clearMemory(); // 重新加载轮播图 imageSlider.setImageList(slideModels,true); }); }).start();
修改后的完整代码
package com.xperiaplayy1.LoteriaPanamaEnVivo; import android.os.Bundle; import android.widget.ImageView; import androidx.appcompat.app.AppCompatActivity; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.signature.ObjectKey; import com.denzcoskun.imageslider.ImageSlider; import com.denzcoskun.imageslider.interfaces.ImageLoadingListener; import com.denzcoskun.imageslider.models.SlideModel; import java.util.ArrayList; import java.util.List; public class Slider extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image_slider); ImageSlider imageSlider = findViewById(R.id.slider); List<SlideModel> slideModels = new ArrayList<>(); slideModels.add(new SlideModel("https://www.codeproject.com/KB/testing/1002904/Test-URL-Redirects-HttpWebRequest.jpg","Piramide 1")); slideModels.add(new SlideModel("https://shortpixel.com/img/robot_lookleft_wink_big.png","Piramide 2")); slideModels.add(new SlideModel("https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Image_created_with_a_mobile_phone.png/1200px-Image_created_with_a_mobile_phone.png","Piramide 3")); slideModels.add(new SlideModel("https://static.remove.bg/remove-bg-web/8fb1a6ef22fefc0b0866661b4c9b922515be4ae9/assets/start_remove-c851bdf8d3127a24e2d137a55b1b427378cd17385b01aec6e59d5d4b5f39d2ec.png","Piramide 4")); slideModels.add(new SlideModel("https://media.istockphoto.com/photos/colored-powder-explosion-abstract-closeup-dust-on-backdrop-colorful-picture-id1072093690?k=20&m=1072093690&s=612x612&w=0&h=Ns3WeEm1VrIHhZOmhiGY_fYKvIlbJrVADLqfxyPQVPM=","Piramide 5")); // 自定义加载逻辑解决缓存旧图问题 imageSlider.setImageLoadingListener(new ImageLoadingListener() { @Override public void loadImage(ImageView imageView, String url, int position) { long dailySign = System.currentTimeMillis() / (1000 * 60 * 60 * 24); RequestOptions options = new RequestOptions() .signature(new ObjectKey(dailySign)) .diskCacheStrategy(DiskCacheStrategy.RESOURCE); Glide.with(Slider.this) .load(url) .apply(options) .into(imageView); } }); imageSlider.setImageList(slideModels,true); } }
内容的提问来源于stack exchange,提问作者Carlos Vanegas
相关产品推荐
相关产品推荐

