首先简单讲下AndroidVideoCache的缓存机制-LruCache.
缓存策略主要包含缓存的添加、获取和删除这三类操作。
LruCache就是利用了LinkedHashMap的访问模式
设置LinkedHashMap 的构造参数是accessOrder = true,
所以每次使用缓存时,都会将数据移至队尾。
因为最新访问的数据都在队尾,如果容量大于一开始设置的max,就删除队首的元素,知道小于max。
使用AndroidVedioCache
在build.gradle中设置
repositories {
jcenter()
}
dependencies {
compile 'com.danikula:videocache:2.7.1'
}
首先,我们确定一个文件夹存放文件(当然也可以默认)
public static File getVedioFile() {
String path = Environment.getExternalStorageDirectory().getPath() + "/cloudvedio";
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
return file;
}
其次,在Application中定义
private HttpProxyCacheServer proxy;
public static HttpProxyCacheServer getProxy() {
return getInstance().proxy == null ? (getInstance().proxy = getInstance().newProxy()) : getInstance().proxy;
}
private HttpProxyCacheServer newProxy() {
return new HttpProxyCacheServer.Builder(this)
.cacheDirectory(getVedioFile())//缓存的文件夹,默认就不写
.maxCacheSize(512 * 1024 * 1024) // 512mb 最大大小,也可为最大个数
.build();
}
使用即是替换掉原有url,比如替换视频原有url
HttpProxyCacheServer proxy = Application.getProxy();
String proxyUrl = proxy.getProxyUrl(videoUrl);//原来url是videoUrl,转化为proxyUrl
videoPlayer.setUp(proxyUrl, null);
//这里第一次请求是url,第二次就会变成file:///....达到缓存的作用
顺便记一笔清除缓存的
/**
* 获取指定文件夹
*
* @param f
* @return
* @throws Exception
*/
public static long getFileSizes(File f) throws Exception {
long size = 0;
File flist[] = f.listFiles();
for (int i = 0; i < flist.length; i++) {
if (flist[i].isDirectory()) {
size = size + getFileSizes(flist[i]);
} else {
size = size + getFileSize(flist[i]);
}
}
return size;
}
/**
* 获取指定文件大小
*
* @param
* @return
* @throws Exception
*/
public static long getFileSize(File file) throws Exception {
long size = 0;
if (file.exists()) {
FileInputStream fis = null;
fis = new FileInputStream(file);
size = fis.available();
} else {
file.createNewFile();
Log.e("获取文件大小", "文件不存在!");
}
return size;
}
/**
* 删除指定文件夹内文件
* @param file
*/
private static void deleteFile(File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
File f = files[i];
deleteFile(f);
}
// file.delete();//如要保留文件夹,只删除文件,请注释这行
} else if (file.exists()) {
file.delete();
}
}