app清理缓存,此方法适用于mui框架开发app人员参考,使用的是插件开发

app清理缓存,此方法适用于mui框架开发app人员参考,使用的是插件开发,之前采取mui框架自带的清理缓存方式,计算到的缓存大小永远都是0,今天测试发现不行,毕竟在android系统设置中有缓存的显示。

废话不多说,直接说规则。

看我的代码的需要大家会使用插件混合开发,对插件开发不熟悉的可以看我之前的博客!

首先时插件js文件

document.addEventListener("plusready",function(){
// 声明的JS“扩展插件别名”
    var _BARCODE = 'clearCache',
        B = window.plus.bridge;
var clearCache = {
//添加操作方法、传入参数、返回类型
clearPhoneCache:function(Argus,successCallback,errorCallback){
        var success = typeof successCallback !== 'function' ? null : function(args) 
            {
            successCallback(args);
            },
            fail = typeof errorCallback !== 'function' ? null : function(code) 
            {
            errorCallback(code);
            };
            callbackID = B.callbackId(success, fail);
            return B.exec(_BARCODE, "clearPhoneCache", [callbackID, Argus]);
            }
};
window.plus.clearCache = clearCache;

},true);

这个文件很关键,他是html格式的webview和java android插件的桥梁,当然,你需要在eclipse中新建类,我的类名是ClearCache。先给大家看看我的插件,插件写的不行,大家参考就行,大神勿喷!

import java.io.File;


import org.json.JSONArray;
import org.json.JSONException;


import android.app.Activity;
import android.util.Log;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;


/**
 * 清理计算缓存插件
 * @author 香蕉不拿拿
 * @date 2018年4月16日 上午11:44:00
 */
@SuppressWarnings("unused")
public class ClearCache extends StandardFeature{
String pCallBackID;
IWebview pWebviews;
Activity activity;

public void clearPhoneCache(IWebview pWebview, JSONArray array) {
Log.i("成功进入--->", "clearPhoneCache");
pWebviews = pWebview;
activity = pWebview.getActivity();
pCallBackID = array.optString(0);

JSONArray jsonArray = null;
try {
jsonArray = new JSONArray(array.optString(1));
String operateName = jsonArray.getString(0);
if(operateName.equals("countCache")) {
//计算缓存
try {
String cacheSize = ClearCacheUtil.getTotalCacheSize(activity);
Log.i("计算缓存大小---->", cacheSize);

String message = "cacheSize-";
message = message + cacheSize;
JSUtil.execCallback(pWebviews, pCallBackID, message, JSUtil.OK, true);
} catch (Exception e) {
e.printStackTrace();
//计算缓存大小异常
//JSUtil.execCallback(pWebviews, pCallBackID, "Count_Cache_Exception", JSUtil.OK, true);
}
}else if(operateName.equals("clearCache")) {
//清理缓存
Log.i("操作类型---->", "清理缓存");
ClearCacheUtil.clearAllCache(activity.getApplicationContext());
String cacheSize;
try {
cacheSize = ClearCacheUtil.getTotalCacheSize(activity);
Log.i("清理缓存后计算缓存大小---->", cacheSize);
String message = "cacheSize-";
message = message + cacheSize;
JSUtil.execCallback(pWebviews, pCallBackID, message, JSUtil.OK, true);
} catch (Exception e) {
e.printStackTrace();
}

}
} catch (JSONException e) {
e.printStackTrace();
}
}

}

反正写了这么多,给大家废话一下JSUtil.execCallback(pWebviews, pCallBackID, "Count_Cache_Exception", JSUtil.OK, true);这个回调很重要,最后个boolean值,之前玩过false,嘿嘿,那叫真坑,如果是false会导致这个回调不能异步!

上面的代码关联的工具类,说实话,工具类是参考别的大神的创作然后自己改了点。

import java.io.File;
import java.math.BigDecimal;


import android.content.Context;
import android.os.Environment;
import android.util.Log;


public class ClearCacheUtil {
/**
* @param context
* @return
* @throws Exception
*             获取当前缓存
*/
public static String getTotalCacheSize(Context context) throws Exception {
long cacheSize = getFolderSize(context.getCacheDir());
Log.i("ClearCacheUtil--getCacheDir-->", String.valueOf(cacheSize));
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
cacheSize += getFolderSize(context.getExternalCacheDir());
Log.i("ClearCacheUtil--getExternalCacheDir-->", String.valueOf(getFolderSize(context.getExternalCacheDir())));
/*long dataBaseSize = getFolderSize(new File("/data/data/"+ context.getPackageName() + "/databases"));
Log.i("本地数据库文件大小--->", String.valueOf(dataBaseSize));
Log.i("本地数据库路径--->", String.valueOf(context.getPackageName()));*/
}
return getFormatSize(cacheSize);
}


/**
* @param context
*            删除缓存
*/
public static void clearAllCache(Context context) {
boolean state1 = deleteDir(context.getCacheDir());
Log.i("ClearCacheUtil--deleteDir-->", String.valueOf(state1));
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
boolean state2 = deleteDir(context.getExternalCacheDir());
Log.i("ClearCacheUtil--deleteDir-->", String.valueOf(state2));
}
}


private static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
int size = 0;
if (children != null) {
size = children.length;
for (int i = 0; i < size; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}


}
if (dir == null) {
return true;
} else {


return dir.delete();
}
}


// 获取文件
// Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/
// 目录,一般放一些长时间保存的数据
// Context.getExternalCacheDir() -->
// SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
public static long getFolderSize(File file) throws Exception {
long size = 0;
try {
File[] fileList = file.listFiles();
int size2 = 0;
if (fileList != null) {
size2 = fileList.length;
for (int i = 0; i < size2; i++) {
// 如果下面还有文件
if (fileList[i].isDirectory()) {
size = size + getFolderSize(fileList[i]);
} else {
size = size + fileList[i].length();
}
}
}else {
Log.i("fileList-->", "null");
}


} catch (Exception e) {
e.printStackTrace();
}
return size;
}


/**
* 格式化单位 计算缓存的大小

* @param size
* @return
*/
public static String getFormatSize(double size) {
double kiloByte = size / 1024;
if (kiloByte < 1) {
//zero kb
return "0K";
}


double megaByte = kiloByte / 1024;
if (megaByte < 1) {
BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
//小数点后两位(四舍五入)
return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
}


double gigaByte = megaByte / 1024;
if (gigaByte < 1) {
BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
}


double teraBytes = gigaByte / 1024;
if (teraBytes < 1) {
BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
}
BigDecimal result4 = new BigDecimal(teraBytes);
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
}
}

这个测试过,可以实现计算app本地缓存大小和清理本地缓存数据,但是对于清理本地数据库文件的还在琢磨,想要做到显示和清理两个功能,计算到本地数据库的大小一直是0.

插件开发,在你的html页面需要使用的位置调用插件js文件,然后定义插件回调和调用处理方法,调用插件<script src="../js/test/clearPhoneCache.js" type="text/javascript" charset="utf-8"></script>,设置回调函数var values = ['countCache'];getCacheSizeByChaJian(values);

function getCacheSizeByChaJian(values){
console.log("11111")
plus.clearCache.clearPhoneCache(values,function(result){
alert(result);
if(result.indexOf("cacheSize-") != -1 && result.length >=12){
//cacheSize-0K  12个长度
formatCache(result);
}
},function(result){
alert(result)
});

}

formatCache(result);这个只是对回调字符串类型的数据做解析显示在指定标签内的方法,没什么意义,我只发个主要的文件,大家参考后明白原理就够了,毕竟学别人的技术就是学别人的思路嘛,我是小白,我为自己代言。

再次读了写,发现漏掉了个关键点,插件开发,还需要在assets文件的data文件下的dcloud_properties.xml中配置你的插件别名和插件路径<feature name="clearCache" value="com.example.clearCache.ClearCache"></feature>


猜你喜欢

转载自blog.csdn.net/qq_38322527/article/details/79968020