美文网首页
Exoplayer2学习-- 通过CacheUtil实现预加载(

Exoplayer2学习-- 通过CacheUtil实现预加载(

作者: vb12 | 来源:发表于2017-12-22 16:56 被阅读833次

    这篇文章记录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));
    

    代码

    相关文章

      网友评论

          本文标题:Exoplayer2学习-- 通过CacheUtil实现预加载(

          本文链接:https://www.haomeiwen.com/subject/nerxgxtx.html