这篇文章记录exoplayer2中如何预加载数据流(或者叫缓存数据), 以及怎么删除已预加载的数据
下载功能:
通过 CacheUtil.cache() 方法可以很方便的实现预加载或者下载数据的功能. 支持各种流格式.
public static void cache(
DataSpec dataSpec,
Cache cache,
DataSource upstream,
CachingCounters counters)
注意: 这是一个阻塞调用, 所以需要在后台线程中调用.
预加载
既然支持了下载功能, 预加载也就很简单了, 只需要把指定下载的数据大小设置为要预加载的大小.
方法就是通过DataSpec 参数.
dataSpec = new DataSpec(uri, 0, 100 * 1024, null);
这样设置就会预加载100k数据.
查询预加载状态
上面的cache()方法接受一个CachingCounters型参数, 可以通过这个参数来实时获取预加载的进度状态.
// In thread A
CacheUtil.cache(dataSpec, cache, upstreamDataSource, counters);
// In thread B
double downloadPercentage = (counters.totalCachedBytes() * 100d) / counters.contentLength;
高级设置
基本功能都可以通过上面的方式实现, 另外还有一个配置更灵活, 功能更强大的重载方法cache() 其支持各种参数的配置
public static void cache(
DataSpec dataSpec,
Cache cache,
CacheDataSource dataSource,
byte[] buffer,
PriorityTaskManager priorityTaskManager,
int priority,
CachingCounters counters,
boolean enableEOFException)
通过PriorityTaskManager参数 可以设置下载的不同优先级, 从而对不同的数据流进行区分对待
删除已缓存数据
public static void remove(Cache cache, String key)
至于key 是从哪来的, 可以看这个更直观的方式:
CacheUtil.remove(cache, CacheUtil.getKey(dataSpec));
网友评论