在上一篇【Android 进阶】仿抖音系列之列表播放视频(二)中,我们实现列表播放视频,这一篇我们来对其做些优化。

当我们滑动列表播放视频时,如果你设置了状态栏显示网速的话,可以看到网速占用比较大,我们需要实现边播边缓存,下次播放时,就可以从缓存中取,减少网络使用。

Github上已经有现成的缓存库,我们只要集成进来就好,这是链接 AndroidVideoCache

1、创建MyApp 继承 Application,并在AndroidManifest.xml 中注册

2、在MyApplication 中添加代码,可以设置缓存路径、缓存大小等,这里用默认路径,配置缓存大小为1G。

private HttpProxyCacheServer proxy;public static HttpProxyCacheServer getProxy(Context context) {MyApp app = (MyApp) context.getApplicationContext();return app.proxy == null ? (app.proxy = app.newProxy()) : app.proxy;}private HttpProxyCacheServer newProxy() {return new HttpProxyCacheServer.Builder(this).maxCacheSize(1024 * 1024 * 1024)       // 1 Gb for cache.build();}

3、在MyVideoPlayer中,重写setUp 方法,这里需要注意的是,要做个判断,如果是本地视频的话,不使用代理

  @Overridepublic void setUp(String url, int screen, Object... objects) {if (url.startsWith("http")) {HttpProxyCacheServer proxy = MyApp.getProxy(context);String proxyUrl = proxy.getProxyUrl(url);super.setUp(proxyUrl, screen, objects);} else {super.setUp(url, screen, objects);}}

就在我们以为万事大吉的时候,却发现并没有什么卵用,而且有时播放第二遍的时候还会卡死,这是什么鬼???

于是我们查看了app的缓存目录,发现同一个视频,会缓存多次,所以我们猜想,是不是缓存这里出了问题?

通过查看AndroidVideoCache的源码,我们发现AndroidVideoCache是通过代理的策略实现一个中间层将我们的网络请求转移到本地实现的代理服务器上,这样我们真正请求的数据就会被代理拿到,这样代理一边向本地写入数据,一边根据我们需要的数据看是读网络数据还是读本地缓存数据再提供给我们,真正做到了数据的复用。

更详细的可以查看这篇博客这是链接

我们打断点,查看下AndroidVideoCache返回的url

可以看到同一个视频,2次返回的url 是不一样的,再翻下AndroidVideoCache的源码,我们看到

  public Builder(Context context) {this.sourceInfoStorage = SourceInfoStorageFactory.newSourceInfoStorage(context);this.cacheRoot = StorageUtils.getIndividualCacheDirectory(context);this.diskUsage = new TotalSizeLruDiskUsage(DEFAULT_MAX_SIZE);this.fileNameGenerator = new Md5FileNameGenerator();this.headerInjector = new EmptyHeadersInjector();}

我们再查看Md5FileNameGenerator的源码

public class Md5FileNameGenerator implements FileNameGenerator {private static final int MAX_EXTENSION_LENGTH = 4;@Overridepublic String generate(String url) {String extension = getExtension(url);String name = ProxyCacheUtils.computeMD5(url);return TextUtils.isEmpty(extension) ? name : name + "." + extension;}private String getExtension(String url) {int dotIndex = url.lastIndexOf('.');int slashIndex = url.lastIndexOf('/');return dotIndex != -1 && dotIndex > slashIndex && dotIndex + 2 + MAX_EXTENSION_LENGTH > url.length() ?url.substring(dotIndex + 1, url.length()) : "";}
}

这里我们可以看到,缓存的文件是上面url 进行md5之后的字符串,再加上原来的文件后缀名,这也是为什么缓存目录下同一个视频,会缓存多次的问题。

知道问题出在哪,就好解决了,我们可以对AndroidVideoCache 返回的路径进行截取,只取我们原先的路径,当做缓存的文件名就可以了

public class MyFileNameGenerator implements FileNameGenerator {private static final int MAX_EXTENSION_LENGTH = 4;@Overridepublic String generate(String url) {String extension = getExtension(url);int dotIndex = url.lastIndexOf('.');if (url.length() > 18 && dotIndex > 18) {return url.substring(dotIndex - 18);}String name = ProxyCacheUtils.computeMD5(url);return TextUtils.isEmpty(extension) ? name : name + "." + extension;}private String getExtension(String url) {int dotIndex = url.lastIndexOf('.');int slashIndex = url.lastIndexOf('/');return dotIndex != -1 && dotIndex > slashIndex && dotIndex + 2 + MAX_EXTENSION_LENGTH > url.length() ?url.substring(dotIndex + 1, url.length()) : "";}
}

修改MyApp 中的代码如下

   private HttpProxyCacheServer proxy;public static HttpProxyCacheServer getProxy(Context context) {MyApp app = (MyApp) context.getApplicationContext();return app.proxy == null ? (app.proxy = app.newProxy()) : app.proxy;}private HttpProxyCacheServer newProxy() {return new HttpProxyCacheServer.Builder(this).maxCacheSize(1024 * 1024 * 1024)       // 1 Gb for cache.fileNameGenerator(new MyFileNameGenerator()).build();}

到这里,本篇文章也结束了

最后,献上完整代码。Github

【Android 进阶】仿抖音系列之列表播放视频(三)相关推荐

  1. 【Android 进阶】仿抖音系列之列表播放视频(二)

    上一篇中,我们实现了仿抖音上下翻页切换视频的效果,详见[Android 进阶]仿抖音系列之翻页上下滑切换视频(一),这一篇,我们来实现抖音列表播放视频. [Android 进阶]仿抖音系列之翻页上下滑 ...

  2. 仿抖音上下滑动列表播放短视频解决方案

    因为公司需求需要搞一个像抖音一样的上下滑动的播放列表,寻找了很多方案,最终觉得这个方案还是比较可行的. 1.播放器选择阿里云播放器 阿里云播放器对接文档地址 https://helpcdn.aliyu ...

  3. android 上下翻页素材,【Android 进阶】仿抖音系列之翻页上下滑切换视频(四)...

    前言 大家好,这是这个系列的第四篇,在阅读这篇文章之前,建议可以先看下之前系列的文章,为了节省篇幅,之前详细说过的地方,这里就不再详细描述了: 这一篇,要说实现的是第一篇中的翻页切换视频. 思路 在第 ...

  4. android抖音切换实现,【Android 进阶】仿抖音系列之视频预览和录制(五)

    前言 大家好,在前几篇中,我们通过2种方式实现了仿抖音的翻页切换视频,仿抖音列表播放视频功能:这一篇,我们来说说视频的录制. 主流的视频录制,一般都采用的是FFmpeg 例如 腾讯短视频,由于FFmp ...

  5. 微信小程序仿抖音上下滑动整屏切换视频

    微信小程序仿抖音上下滑动整屏切换视频 使用官网上面的扩展组件 官方使用的方式: 可结合自己业务修改: 使用官网上面的扩展组件 https://developers.weixin.qq.com/mini ...

  6. Android高仿抖音滚动聊天,Android仿抖音列表效果

    本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...

  7. android 高仿抖音界面,2018-11-05 Android 仿抖音选择封面自定义控件

    写在前头,抖音里面很多控件,效果很不错,但是,Android 跟iOS的表现形式以及实现方式,都是有区别的,这里实现Android左右拖拉控件进行视频封面选择. public class Choice ...

  8. 仿抖音写上下滑动切换视频

    公司小程序要做个仿抖音上下切换视频的效果,一开始想用swiper,有资料说多了会卡.原因是video标签太多的原因,查看资料有只是用一个video标签的,滑动时切换src即可 全部代码 <tem ...

  9. Android高仿抖音照片电影功能

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 PhotoMovie(https://github.com/yellowcath/PhotoMovie)可轻松实现类似抖音.微视.美 ...

最新文章

  1. 2020港澳台iptv直播软件_用什么便签软件准时提醒开学第一课2020直播开始?
  2. 【web安全】Spring Data Commons 1.13.10 SpEL漏洞分析
  3. CPU 的 ring0、ring1、ring2、ring3
  4. 2013年长沙网络赛G题
  5. 2021牛客暑期多校训练营1 H-Hash Function(数学+FFT)
  6. 安卓案例:基于HttpClient下载文本与图片
  7. 7006.vue电商实战项目2-登录退出功能
  8. 整数类型及整数类型的显示转换
  9. Poj 2001 Shortest Prefix(字典树模板)
  10. vue-html5-editor接收数据,在vue中获取wangeditor的html和text的操作
  11. hdfs 数据迁移_对象存储BOS发布全新工具,加速自建HDFS到云端的访问速度
  12. 好程序员web前端干货之web前端开发框架汇总
  13. [Swift]LeetCode311. 稀疏矩阵相乘 $ Sparse Matrix Multiplication
  14. Xcode和macOS对应关系查询网址
  15. 今日头条导航栏动画选中+recyclerview
  16. SHIO世硕科技马新云携全体员工:2021,在此感谢所有的一切!
  17. Laravel之数据库操作与Eloquent模型使用总结
  18. 【定位设备】蓝牙信标接近距离的计算方式及其部署原则
  19. Python办公自动化,合并excel+pdf转word等
  20. Cesium 可视域分析代码段(源码)补充

热门文章

  1. OPC UA性能评估
  2. 轻松入门电磁兼容:电子设备的敏感性试验
  3. java使用spire.office.free给office添加水印
  4. 供配电系统实验实训装置QY-PGD13
  5. SUN 场景图像数据
  6. 如何防止量化策略的陷阱
  7. R语言一键制作数据统计三线表(一)
  8. SQL SELECT TOP 子句详解
  9. OpenJudge 2786 Pell数列
  10. “我们的开源项目”活动发起人——庄表伟专访