网站建设评价标准,无锡高端网站设计公司,wordpress黑糖主题破解,免费域名证书申请在播放音视频时#xff0c;如何开启 Android Media3 ExoPlayer 缓存#xff0c;请参考笔者另外一篇文章#xff1a;
Android Media3 Exoplayer 开启缓存功能 笔者在设置 ExoPlayer 的缓存大小时#xff0c;遇到一个非常奇怪的问题#xff0c;例如#xff0c;设置最大缓存… 在播放音视频时如何开启 Android Media3 ExoPlayer 缓存请参考笔者另外一篇文章
Android Media3 Exoplayer 开启缓存功能 笔者在设置 ExoPlayer 的缓存大小时遇到一个非常奇怪的问题例如设置最大缓存为 5G
//5G cache (单位byte)
long maxCacheSize 5 * 1024 * 1024 * 1024; 如果你能一眼看出这行代码的问题说明读者非常心细且基础知识是比较扎实的。^_^ 这么设置以后会出现什么问题呢每次当缓存大小达到在 1G 多一点就无法再增加了总是在一个数值附近上下浮动。但是缓存大小设置为 1G1 * 1024 * 1024 * 1024不会有问题。 然后又尝试其他几个缓存数值
//2G cache
long maxCacheSize 2 * 1024 * 1024 * 1024;
//3G cache
long maxCacheSize 3 * 1024 * 1024 * 1024;
//4G cache
long maxCacheSize 4 * 1024 * 1024 * 1024; 按上面方式设置后客户端播放不同视频来进行测试以便客户端存储更多的缓存但是从“缓存的文件夹”获取的“全部缓存文件总的大小”都是在零点几K、几M之间徘徊这些数值表明本地缓存文件数量和大小是不正常的。 为什么缓存空间设置更大反而无法正常缓存呢问题出在哪里呢其实就出在 JAVA 数值类型的转换上。很简单只需要在上面的代码后面加上一个字母 L问题就全部解决了
//2G cache
long maxCacheSize 2 * 1024 * 1024 * 1024L;
//3G cache
long maxCacheSize 3 * 1024 * 1024 * 1024L;
//4G cache
long maxCacheSize 4 * 1024 * 1024 * 1024L;
//5G cache
long maxCacheSize 5 * 1024 * 1024 * 1024L; 如果不加上 L 这个后缀这几个整数相乘的结果会作为整形数值保存在在内存中但是整数是有数值范围的 基本类型int 二进制位数32 包装类java.lang.Integer 最小值Integer.MIN_VALUE -2147483648 -2的31次方 最大值Integer.MAX_VALUE 2147483647 2的31次方-1 上面设置的缓存大小如果超过了 int 整数的数值范围就会发生溢出最后的结果就会与我们预设的值不一致。反之如果加上 L 后缀才是 long 类型的而上面的数值是在 long 数值范围之内的就不会发生溢出。那么不加 L上面四个 test 值发生溢出后最终得到的值是什么呢
long test2 2 * 1024 * 1024 * 1024; //-2147483648
long test3 3 * 1024 * 1024 * 1024; //-1073741824
long test4 4 * 1024 * 1024 * 1024; //0
long test5 5 * 1024 * 1024 * 1024; //1073741824//控制台输出值test2: -2147483648 - test 3: -1073741824 - test 4: 0 - test 5: 1073741824
CLog.d(test, test2: test2 - test 3: test3 - test 4: test4 - test 5: test5);可以观察到上面的赋值发生溢出后得到实际的数值要不变成负数、零、或者变小了这就解释了为什么会出现上面那个奇怪问题。这里抛砖引玉其他类似播放器的缓存大小设置可能也会遇到同样的问题所以需要小心对待避免落入隐蔽的陷阱。