ExoPlayer使用SimpleCache与DefaultDatabaseProvider删除单个媒体缓存的方法
ExoPlayer SimpleCache 单媒体缓存删除实现方案
SimpleCache 自带的静态 delete 方法仅支持删除整个缓存目录的全部内容,没有直接提供单媒体缓存删除的API,可以通过匹配缓存 Key 遍历删除对应缓存片段的方式实现需求。
实现思路
- 缓存 Key 生成规则需要和你构造
CacheDataSource时使用的CacheKeyFactory完全一致,默认实现为DefaultCacheKeyFactory,会基于 MediaItem 的 URI 生成缓存 Key - 调用
SimpleCache的getCachedSpans方法拿到指定 Key 对应的所有缓存片段 - 遍历删除所有匹配的缓存片段即可,注意要和 SimpleCache 共用同一把锁保证线程安全
代码实现
注意:SimpleCache 是实例对象,你需要传入 App 全局唯一初始化的 SimpleCache 实例,如果要完全匹配你给出的静态方法形式,可以把全局 SimpleCache 实例存在静态变量中直接取用。
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.upstream.cache.Cache; import com.google.android.exoplayer2.upstream.cache.CacheKeyFactory; import com.google.android.exoplayer2.upstream.cache.CacheSpan; import com.google.android.exoplayer2.upstream.cache.DefaultCacheKeyFactory; import com.google.android.exoplayer2.upstream.cache.SimpleCache; import java.util.NavigableSet; public static void deleteOneMediaCache(SimpleCache simpleCache, MediaItem mediaItem) { if (simpleCache == null || mediaItem == null || mediaItem.localConfiguration == null) { return; } // 此处替换为你实际使用的CacheKeyFactory,和写入缓存时的实现保持一致 CacheKeyFactory cacheKeyFactory = DefaultCacheKeyFactory.DEFAULT; String cacheKey = cacheKeyFactory.buildCacheKey(mediaItem, C.FORMAT_NONE, null, C.SELECTION_REASON_UNKNOWN); // 加锁保证线程安全,和SimpleCache内部锁逻辑保持一致 synchronized (simpleCache) { NavigableSet<CacheSpan> cachedSpans = simpleCache.getCachedSpans(cacheKey); if (cachedSpans == null || cachedSpans.isEmpty()) { return; } // 遍历删除该媒体所有缓存片段 for (CacheSpan span : cachedSpans) { try { simpleCache.removeSpan(span); } catch (Cache.CacheException e) { // 可根据业务需要处理删除异常 e.printStackTrace(); } } } } // 如果你要完全匹配期望的无SimpleCache参数的方法形式,参考如下实现,替换为你自己的全局SimpleCache实例即可 /* public static void deleteOneMediaCache(MediaItem mediaItem){ // YourAppGlobalInstance.sAppSimpleCache 替换为你自己全局初始化的SimpleCache静态实例 deleteOneMediaCache(YourAppGlobalInstance.sAppSimpleCache, mediaItem); } */
注意事项
- 如果你自定义过
CacheKeyFactory,一定要替换代码中的默认实现,保证生成的缓存 Key 和写入时完全一致,否则无法匹配到对应缓存 - 删除操作属于IO操作,建议放到子线程执行,避免阻塞主线程
内容的提问来源于stack exchange,提问作者itning
相关产品推荐
相关产品推荐

