You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExoPlayer使用SimpleCache与DefaultDatabaseProvider删除单个媒体缓存的方法

ExoPlayer SimpleCache 单媒体缓存删除实现方案

SimpleCache 自带的静态 delete 方法仅支持删除整个缓存目录的全部内容,没有直接提供单媒体缓存删除的API,可以通过匹配缓存 Key 遍历删除对应缓存片段的方式实现需求。

实现思路

  1. 缓存 Key 生成规则需要和你构造 CacheDataSource 时使用的 CacheKeyFactory 完全一致,默认实现为 DefaultCacheKeyFactory,会基于 MediaItem 的 URI 生成缓存 Key
  2. 调用 SimpleCache 的 getCachedSpans 方法拿到指定 Key 对应的所有缓存片段
  3. 遍历删除所有匹配的缓存片段即可,注意要和 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:36:02