由于项目需要最近在做webapp开发用的是MUI框架,自己本来是做原生开发的,在开发的时候有一个需求是实现计算缓存和清除缓存的功能,原生java方法实现轻轻松松,网上代码一大把,不过是webapp倒是不好搞,MUI自己是有套原生模块调用,而且有这个计算缓存的方法API,不过遗憾的是在安卓端有bug,获取不到缓存大小(他们客服说的~~),自己测试确实是这样,不好使。IOS听说没事。。。这就有点尬了@#¥#&……*……想办法查资料,web浏览器套壳肯定可以js调用java原生方法?可以的,结合他们官方文档。动手撸起来
1、安卓本地离线打包
这个不用说,用这个框架要会用as打包,会安卓原生开发打包会发现很简单的~~~,文档,用as先跑起来,因为我们需要自己写java方法实现这个缓存计算与清除,然后js去调用。
2、定义java类实现计算缓存与清空缓存
新建类、方法
计算缓存:
/*** 获取缓存大小* @param context* @return* @throws Exception*/
public static String getTotalCacheSize(Context context) throws Exception {long cacheSize = getFolderSize(context.getCacheDir());if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {cacheSize = getFolderSize(context.getExternalCacheDir());}return getFormatSize(cacheSize);
}public static long getFolderSize(File file) throws Exception {long size = 0;try {File[] fileList = file.listFiles();for (int i = 0; i < fileList.length; i ) {// 如果下面还有文件if (fileList[i].isDirectory()) {size = size getFolderSize(fileList[i]);} else {size = size fileList[i].length();}}} catch (Exception e) {e.printStackTrace();}return size;
} /*** 格式化单位** @param size* @return*/public static String getFormatSize(double size) {double kiloByte = size / 1024;
// if (kiloByte < 1) {
// return size "Byte";
// }double megaByte = kiloByte / 1024;if (megaByte < 1) {BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() "K";}double gigaByte = megaByte / 1024;if (gigaByte < 1) {BigDecimal result2 = new BigDecimal(Double.toString(megaByte));return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() "M";}double teraBytes = gigaByte / 1024;if (teraBytes < 1) {BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() "G";}BigDecimal result4 = new BigDecimal(teraBytes);return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()"T";}
清空缓存:
/*** 清空缓存* @param context*/
public static void clearAllCache(Context context) {deleteDir(context.getCacheDir());if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {deleteDir(context.getExternalCacheDir());}}
private static boolean deleteDir(File dir) {if (dir != null && dir.isDirectory()) {String[] children = dir.list();for (int i = 0; i < children.length; i ) {boolean success = deleteDir(new File(dir, children[i]));if (!success) {return false;}}}return dir.delete();
}
三、JS调用
首先判断平台,这个MUI有api判断是安卓还是ios,因为这个只是安卓端有问题我们在安卓端进行处理就ok,ios就用他们提供的方法。然后在js中导入我们这个类,要全路径,
CleanDataUtils = plus.android.importClass("com.oking.wisdomMeteorological.utils.CleanDataUtils");
计算缓存:
调用这个类的方法,我们定义的java方法需要传入上下文这里传入activity对象就是
totalCacheSize = CleanDataUtils.getTotalCacheSize(plus.android.runtimeMainActivity());
totalCacheSize 就是我们获取到的缓存大小。
清除缓存同上:
CleanDataUtils.clearAllCache(plus.android.runtimeMainActivity());
效果:
看到这里是不是觉得很简单,确实很简单,在MUI框架下就几行代码,自己实现java方法就行了。
现在的webapp开发平台有很多,Dcloud、APIcloud、Bingotouch , Cordova(前身为PhoneGap)、BUI、Appcan 等,借助这些平台我们能快速开发出一个跨平台应用,在开发跨平台应用时避免不了需要调用特定平台的原生API,当框架的5 Nactive能力不好使时我们可以尝试自己去写java原生代码(大部分框架是能够满足日常开发需求的),这是一种混合开发模式,自己以后要是需要用原生实现一些功能也可以举一反三。