转载

MUI调用原生自定义方法实现计算缓存与清空缓存

由于项目需要最近在做webapp开发用的是MUI框架,自己本来是做原生开发的,在开发的时候有一个需求是实现计算缓存和清除缓存的功能,原生java方法实现轻轻松松,网上代码一大把,不过是webapp倒是不好搞,MUI自己是有套原生模块调用,而且有这个计算缓存的方法API,不过遗憾的是在安卓端有bug,获取不到缓存大小(他们客服说的~~),自己测试确实是这样,不好使。IOS听说没事。。。这就有点尬了@#¥#&……*……想办法查资料,web浏览器套壳肯定可以js调用java原生方法?可以的,结合他们官方文档。动手撸起来

1、安卓本地离线打包

这个不用说,用这个框架要会用as打包,会安卓原生开发打包会发现很简单的~~~,文档,用as先跑起来,因为我们需要自己写java方法实现这个缓存计算与清除,然后js去调用。

2、定义java类实现计算缓存与清空缓存

新建类、方法 MUI调用原生自定义方法实现计算缓存与清空缓存

计算缓存:

/**
 * 获取缓存大小
 * @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调用原生自定义方法实现计算缓存与清空缓存

看到这里是不是觉得很简单,确实很简单,在MUI框架下就几行代码,自己实现java方法就行了。

现在的webapp开发平台有很多,Dcloud、APIcloud、Bingotouch , Cordova(前身为PhoneGap)、BUI、Appcan 等,借助这些平台我们能快速开发出一个跨平台应用,在开发跨平台应用时避免不了需要调用特定平台的原生API,当框架的5+Nactive能力不好使时我们可以尝试自己去写java原生代码(大部分框架是能够满足日常开发需求的),这是一种混合开发模式,自己以后要是需要用原生实现一些功能也可以举一反三。

原文  https://juejin.im/post/5baf22815188255c3272ca5b
正文到此结束
Loading...