由于项目需要最近在做webapp开发用的是MUI框架,自己本来是做原生开发的,在开发的时候有一个需求是实现计算缓存和清除缓存的功能,原生java方法实现轻轻松松,网上代码一大把,不过是webapp倒是不好搞,MUI自己是有套原生模块调用,而且有这个计算缓存的方法API,不过遗憾的是在安卓端有bug,获取不到缓存大小(他们客服说的~~),自己测试确实是这样,不好使。IOS听说没事。。。这就有点尬了@#¥#&……*……想办法查资料,web浏览器套壳肯定可以js调用java原生方法?可以的,结合他们官方文档。动手撸起来
这个不用说,用这个框架要会用as打包,会安卓原生开发打包会发现很简单的~~~,文档,用as先跑起来,因为我们需要自己写java方法实现这个缓存计算与清除,然后js去调用。
新建类、方法
计算缓存:
/** * 获取缓存大小 * @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(); } 复制代码
首先判断平台,这个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原生代码(大部分框架是能够满足日常开发需求的),这是一种混合开发模式,自己以后要是需要用原生实现一些功能也可以举一反三。