IT评测·应用市场-qidao123.com

标题: 面试总结之 Glide自定义的三级缓存策略 [打印本页]

作者: 圆咕噜咕噜    时间: 2025-3-20 04:53
标题: 面试总结之 Glide自定义的三级缓存策略
一、为什么需要三级缓存?

在移动应用开发中,图片加载性能直接影响用户体验。根据 Google 统计,图片加载延迟超过 1 秒会导致 32% 的用户流失。传统图片加载方案存在以下痛点:

Glide 通过三级缓存策略,将图片加载速度提升 50%,内存占用降低 45%
内存缓存(Memory Cache)
  1. import android.content.Context;
  2. import com.bumptech.glide.Glide;
  3. import com.bumptech.glide.GlideBuilder;
  4. import com.bumptech.glide.load.engine.cache.LruResourceCache;
  5. import com.bumptech.glide.module.AppGlideModule;
  6. public class CustomGlideModule extends AppGlideModule {
  7.     @Override
  8.     public void applyOptions(Context context, GlideBuilder builder) {
  9.         // 获取设备的最大内存
  10.         int maxMemory = (int) Runtime.getRuntime().maxMemory();
  11.         // 计算内存缓存的大小,这里设置为最大内存的15%
  12.         int memoryCacheSize = maxMemory / 1024 / 1024 * 15;
  13.         // 创建LruResourceCache对象
  14.         builder.setMemoryCache(new LruResourceCache(memoryCacheSize));
  15.     }
  16. }
复制代码
解释:我们自定义了一个 AppGlideModule 类 CustomGlideModule。在 applyOptions 方法里,先获取设备的最大内存,接着盘算出内存缓存的巨细,这里设定为最大内存的 15%,末了使用 LruResourceCache 来设置内存缓存。  

磁盘缓存(Disk Cache)
  1. import android.content.Context;
  2. import com.bumptech.glide.Glide;
  3. import com.bumptech.glide.GlideBuilder;
  4. import com.bumptech.glide.load.engine.cache.DiskLruCacheFactory;
  5. import com.bumptech.glide.module.AppGlideModule;
  6. public class CustomDiskCacheGlideModule extends AppGlideModule {
  7.     @Override
  8.     public void applyOptions(Context context, GlideBuilder builder) {
  9.         // 设置磁盘缓存的路径
  10.         String diskCachePath = context.getCacheDir().getPath() + "/glide_cache";
  11.         // 设置磁盘缓存的大小为100MB
  12.         int diskCacheSize = 1024 * 1024 * 100;
  13.         // 创建DiskLruCacheFactory对象
  14.         builder.setDiskCache(new DiskLruCacheFactory(diskCachePath, diskCacheSize));
  15.     }
  16. }
复制代码
解释:我们同样自定义了一个 AppGlideModule 类 CustomDiskCacheGlideModule。在 applyOptions 方法里,先设置磁盘缓存的路径,再将磁盘缓存的巨细设置为 100MB,末了使用 DiskLruCacheFactory 来设置磁盘缓存。

网络缓存(Network Cache)
  1. import android.content.Context;
  2. import com.bumptech.glide.Glide;
  3. import com.bumptech.glide.GlideBuilder;
  4. import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader;
  5. import com.bumptech.glide.load.model.GlideUrl;
  6. import com.bumptech.glide.module.AppGlideModule;
  7. import okhttp3.Cache;
  8. import okhttp3.OkHttpClient;
  9. import java.io.InputStream;
  10. public class CustomNetworkCacheGlideModule extends AppGlideModule {
  11.     @Override
  12.     public void registerComponents(Context context, Glide glide, Registry registry) {
  13.         // 设置网络缓存的路径
  14.         Cache cache = new Cache(context.getCacheDir(), 1024 * 1024 * 50);
  15.         // 创建OkHttpClient对象并设置缓存
  16.         OkHttpClient client = new OkHttpClient.Builder()
  17.                .cache(cache)
  18.                .build();
  19.         // 注册OkHttpUrlLoader,让Glide使用OkHttp进行网络请求
  20.         registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));
  21.     }
  22. }
复制代码
   解释:自定义了 CustomNetworkCacheGlideModule 类,在 registerComponents 方法中,先设置网络缓存的路径和巨细(这里是 50MB),然后创建 OkHttpClient 并设置缓存,末了注册 OkHttpUrlLoader,使 Glide 接纳 OkHttp 举行网络哀求。

使用 Glide 加载图片

  1. import android.os.Bundle;
  2. import android.widget.ImageView;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import com.bumptech.glide.Glide;
  5. import com.bumptech.glide.load.engine.DiskCacheStrategy;
  6. public class MainActivity extends AppCompatActivity {
  7.     @Override
  8.     protected void onCreate(Bundle savedInstanceState) {
  9.         super.onCreate(savedInstanceState);
  10.         setContentView(R.layout.activity_main);
  11.         ImageView imageView = findViewById(R.id.imageView);
  12.         String imageUrl = "https://example.com/image.jpg";
  13.         Glide.with(this)
  14.                .load(imageUrl)
  15.                // 设置磁盘缓存策略为缓存所有类型的图片
  16.                .diskCacheStrategy(DiskCacheStrategy.ALL)
  17.                .into(imageView);
  18.     }
  19. }
复制代码
在 MainActivity 中,我们使用 Glide 加载图片。通过 diskCacheStrategy(DiskCacheStrategy.ALL) 方法设置磁盘缓存策略,这里表现缓存全部类型的图片。 
 

简朴概述:
具体概述
每一层的具体实现

1. 内存缓存(Memory Cache)


2. 磁盘缓存(Disk Cache)


3. 网络缓存(Network Cache)


常见问题解决方案

1. 缓存穿透

  1. Glide.with(context)
  2.    .load(url)
  3.    .error(R.drawable.ic_error) // 设置错误占位图
  4.    .placeholder(R.drawable.ic_loading) // 设置加载占位图
  5.    .fallback(R.drawable.ic_fallback) // 设置空值占位图
  6.    .into(imageView);
复制代码
2. 缓存雪崩 
  1. int cacheDuration = TimeUnit.HOURS.toMillis(24) + new Random().nextInt(3600000);
复制代码
3. OOM 预防
  1. // 使用RGB_565格式减少内存占用
  2. Glide.with(context)
  3.    .load(url)
  4.    .format(DecodeFormat.PREFER_RGB_565)
  5.    .into(imageView);
复制代码
关键指标的获取途径

  1. long startTime = System.currentTimeMillis();
  2. Glide.with(this).load(url).into(imageView);
  3. long duration = System.currentTimeMillis() - startTime;
  4. Log.d("GlideTest", "加载耗时: " + duration + "ms");
复制代码
扩展追问:
如何解决内存缓存导致的 OOM 问题?
动态尺寸压缩:
  1. Glide.with(context)
  2.     .load(url)
  3.     .override(imageView.width, imageView.height)
  4.     .into(imageView)
复制代码
格式优化:优先使用 WebP 格式(体积减少 30%)
生命周期绑定:通过Glide.with(this)主动开释资源
内存监控:结合 Android Profiler 设置内存阈值报警
总结:通过合理设置和优化,可显著提升应用性能,降低用户流失率。建议开发者在新项目中优先接纳 Glide 的三级缓存方案,并根据现实需求举行定制化调解。
感谢观看!!! 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4