? ? 在播放音视频时,如何开启 Android Media3 ExoPlayer 缓存,请参考笔者另外一篇文章:
Android Media3 Exoplayer?开启缓存功能
? ? 笔者在设置 ExoPlayer 的缓存大小时,遇到一个非常奇怪的问题,例如,设置最大缓存为 5G:
//5G cache (单位:byte)
long maxCacheSize = 5 * 1024 * 1024 * 1024;
? ? 如果你能一眼看出这行代码的问题,说明读者非常心细且基础知识是比较扎实的。^_^
? ? 这么设置以后,会出现什么问题呢?每次当缓存大小达到在 1G 多一点,就无法再增加了,总是在一个数值附近上下浮动。但是缓存大小设置为 1G(1 * 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)
? ? 上面设置的缓存大小,如果超过了整数的数值范围就会发生溢出,最后的结果就会与我们预设的值不一致。那么上面四个值如果发生溢出后的值是多少呢?
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: 2097152000 - test 3: -1149239296 - test 4: -100663296 - test 5: 947912704
CLog.d("test", "test2: " + test2 + " - test 3: " + test3 + " - test 4: " + test4 + " - test 5: " + test5);
? ? 可以观察到,上面的赋值发生溢出后得到实际的数值,要不变成负数、零、或者变小了,这就解释了为什么会出现上面那个奇怪问题。