用h5开发app的程序员朋友一定会遇到app用久了缓存堆积的问题。我这边话不多说直接上代码,代码注释清晰,如有不恰当的地方,欢迎提出讨论。
/*!
* 黄国烨(448249687@qq.com)
* Date: 2017-10-15
* 清除缓存组件
*/
(function($) {
var _CacheClean = {
/**
* 获取缓存入口,总入口
*/
init: function() {
plus.nativeUI.showWaiting("正在计算缓存...");
plus.cache.calculate(function(size) {
//通过URL参数获取目录对象或文件对象
plus.io.resolveLocalFileSystemURL('_doc', function(entry) {
//alert("是否是文件夹对象="+entry.isDirectory);
var dirReader = entry.createReader();
dirReader.readEntries(function(entries) {
// alert('_doc文件个数='+entries.length);
console.log('+文件前size=' + size);
_CacheClean.getDirFileSize(entries, entries.length, 0, 0, size);
// size += getDirFileSize(entries,entries.length,0,0,size);
// console.log('+文件后size='+size);
// for (var k = 0 ; k < entries.length ; k++) {
// var entriyTemp = entries[k];
// if(entriyTemp.isFile){
// //获取文件的属性
// entry.getMetadata( function ( metadata ) {
// console.log("metadata: " + k + '=' + JSON.stringify(metadata));
// var sizeNum = metadata.size ;
// size = size + sizeNum ;
// }, function () {
// alert( e.message );
// } );
// }
//
// }
// console.log('调用viewCache()==='+size);
// viewCache(size);
}, function(e) {
alert("Read directory dirReader.readEntries failed: " + e.message);
});
}, function(e) {
mui.alert('plus.io.resolveLocalFileSystemURL-error=' + e.message);
});
});
},
/**
* 递归获取某个文件夹的各个文件大小的总和 byte
* @param {Object} entries 某个文件夹的文件总和数组对象
* @param {Object} len 文件夹的文件个数
* @param {Object} k 当前是第i个文件
* @param {Object} size 后面返回的文件大小
* @param {Object} sizeYuan 后面返回的文件大小
*/
getDirFileSize: function(entries, len, k, size, sizeYuan) {
len = Number(len);
k = Number(k);
size = Number(size);
sizeYuan = Number(sizeYuan);
var entriyTemp = entries[k];
if(entriyTemp.isFile) {
//获取文件的属性
entriyTemp.getMetadata(function(metadata) {
var sizeNum = metadata.size;
size = size + sizeNum;
console.log(size + "====metadata: " + k + '=' + JSON.stringify(metadata));
if(len <= k + 1) {
console.log('getDirFileSize===' + size);
_CacheClean.viewCache(size + sizeYuan);
return;
} else {
k += 1;
_CacheClean.getDirFileSize(entries, len, k, size, sizeYuan);
}
}, function() {
alert(e.message);
});
} else {
if(len <= k + 1) {
console.log('getDirFileSize-else===' + size);
this.viewCache(size + sizeYuan);
return;
} else {
k += 1;
arguments.callee(entries, len, k, size, sizeYuan);
}
}
},
/**
* 页面上展示缓存的大小
* @param {Object} size 缓存大小(byte)
*/
viewCache: function(size) {
var kbCache = Number(size) / 1024;
if(kbCache < 0.01) {
mui.toast('系统暂无缓存');
plus.nativeUI.closeWaiting();
return;
}
var mbCache = Number(kbCache) / 1024;
if(kbCache < 20) {
kbCache = kbCache + '';
this.clearCacheAction(kbCache.substring(0, kbCache.indexOf('.') + 6), 'KB');
return;
}
if(mbCache < 2) {
kbCache = kbCache + '';
this.clearCacheAction(kbCache.substring(0, kbCache.indexOf('.') + 2), 'KB');
return;
}
mbCache = mbCache + '';
this.clearCacheAction(mbCache.substring(0, mbCache.indexOf('.') + 2), 'MB');
},
/**
* 清缓存动作
* @param {Object} size 缓存大小
* @param {Object} danwei 单位
*/
clearCacheAction: function(size, danwei) {
if(plus.nativeUI) {
plus.nativeUI.closeWaiting();
}
mui.confirm('app现有系统缓存' + size + danwei + ',是否立即进行清除?', '提示', btnArray, function(e) {
if(e.index == 0) {
plus.nativeUI.showWaiting("正在清理缓存...");
//mui.toast('111')
plus.storage.clear();
plus.cache.clear(function(e) {
console.log('删除缓存成功==,调用clearDirCache' + JSON.stringify(e));
_CacheClean.clearDirCache();
});
}
});
},
/**
* 清理_doc目录下的文件
*/
clearDirCache: function() {
plus.io.resolveLocalFileSystemURL('_doc', function(entry) {
//alert("是否是文件夹对象="+entry.isDirectory);
var dirReader = entry.createReader();
dirReader.readEntries(function(entries) {
_CacheClean.clearDirCacheAction(entries, entries.length, 0);
}, function(e) {
alert("Read directory dirReader.readEntries failed: " + e.message);
});
},
function(e) {
mui.alert('plus.io.resolveLocalFileSystemURL-error=' + e.message);
});
},
/**
* 清除_doc缓存
* @param {Object} entries doc文件
* @param {Object} len doc文件个数
* @param {Object} k 当前第几个0开始
*/
clearDirCacheAction: function(entries, len, k) {
len = Number(len);
k = Number(k);
var entriyTemp = entries[k];
if(entriyTemp.isFile) {
entriyTemp.remove(function(entry) {
plus.console.log("Remove succeeded");
if(k + 1 >= len) {
_CacheClean.restarApp();
} else {
k += 1;
_CacheClean.clearDirCacheAction(entries, len, k)
}
}, function(e) {
alert(e.message);
if(k + 1 >= len) {
restarApp();
} else {
k += 1;
arguments.callee(entries, len, k)
}
});
} else {
if(k + 1 >= len) {
this.restarApp();
} else {
k += 1;
arguments.callee(entries, len, k)
}
}
},
/**
* 重启该应用
*/
restarApp : function(){
if(plus.nativeUI){
plus.nativeUI.closeWaiting();
}
mui.alert('清除缓存成功,请点击“确定”重启应用',function(){
plus.nativeUI.showWaiting("正在关闭...");
window.setTimeout(function(){
plus.runtime.restart();
},1000);
});
}
};
_App.cacleClean = _CacheClean;
console.log('HGY-clen-cache init finished!');
}(mui))