在计算总的Andr​​oid应用程序缓存大小 [英] calculate total app cache size in android

查看:135
本文介绍了在计算总的Andr​​oid应用程序缓存大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图来计算所有缓存size.my code是如下。

I am trying to calculate all cache size.my code is as follow..

   totalSize=0;

    PackageManager packageManager = context.getPackageManager();


     /* List<PackageInfo> packs = packageManager
      .getInstalledPackages(PackageManager.GET_ACTIVITIES);*/
     // PackageManager.GET_META_DATA

    List<PackageInfo> packs = packageManager
            .getInstalledPackages(PackageManager.GET_META_DATA);

    for (int i = 0; i < packs.size(); i++) {

        PackageInfo p = packs.get(i);

        Method getPackageSizeInfo;
        try {
            getPackageSizeInfo = packageManager.getClass().getMethod(
                    "getPackageSizeInfo", String.class,
                    IPackageStatsObserver.class);

            getPackageSizeInfo.invoke(packageManager, p.packageName,
                    new IPackageStatsObserver.Stub() {

                        @Override
                        public void onGetStatsCompleted(
                                PackageStats pStats, boolean succeeded)
                                throws RemoteException {

                            totalSize = totalSize + pStats.cacheSize;
                            Log.d("size", totalSize+"");
                            Toast.makeText(context, "size"+totalSize, Toast.LENGTH_SHORT).show();
                        }
                    }

            );
        } catch (Exception e) {
            try {
                getPackageSizeInfo = packageManager.getClass().getMethod(
                        "getPackageSizeInfo", String.class,
                        IPackageStatsObserver.class);

                getPackageSizeInfo.invoke(packageManager, p.packageName,
                        new IPackageStatsObserver.Stub() {

                            @Override
                            public void onGetStatsCompleted(
                                    PackageStats pStats, boolean succeeded)
                                    throws RemoteException {

                                totalSize = totalSize + pStats.cacheSize;
                                Log.d("size", totalSize+"");
                                Toast.makeText(context, "size"+totalSize, Toast.LENGTH_SHORT).show();
                            }
                        }

                );
            } catch (Exception ee) {
                Log.d("eeeeeeeeeee", "error");
                ee.printStackTrace();
            } 
        } 

    }
    Log.d("return size", totalSize+"");
    Toast.makeText(context, "return size"+totalSize, Toast.LENGTH_SHORT).show();
    return totalSize;

在这里,我得到的缓存大小为每个package.the问题是总计TOTALSIZE的返回值是第一,那么函数onGetStatsCompleted()调用。所以,我总是得到0值总计TOTALSIZE。

Here I get cache size for each package.the problem is the value of totalSize is returned first and then the function onGetStatsCompleted() called. So I always get 0 value for totalSize.

这也给予例外: -

It also give Exception:-

JavaBinder(525): * 的未捕获远程异常! (异常不跨进程尚不支持。)
JavaBinder(525):了java.lang.RuntimeException:无法内螺纹已不叫尺蠖prepare创造处理器()

JavaBinder(525): * Uncaught remote exception! (Exceptions are not yet supported across processes.) JavaBinder(525): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

谁能帮我?

推荐答案

删除吐司从回调 onGetStatsCompleted()方法。你会摆脱例外

Remove the Toast from your callback onGetStatsCompleted() method. You will get rid of the exception

像这样的东西替换你的code和检查它是否适合你。

Replace your code with something like this and check if it works for you.

private int getTotalSize() {
        totalSize = 0;

        PackageManager packageManager = getApplicationContext().getPackageManager();

        List<PackageInfo> packs = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);

        for (int i = 0; i < packs.size(); i++) {
            PackageInfo p = packs.get(i);
            Method getPackageSizeInfo;
            try {
                getPackageSizeInfo = packageManager.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
                getPackageSizeInfo.invoke(packageManager, p.packageName, new IPackageStatsObserver.Stub() {
                    @Override
                    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
                        totalSize = (int) (totalSize + pStats.cacheSize);
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();    
            }
        }
        Log.d("return size", totalSize + "");
        Toast.makeText(MainActivity.this, "Total cache size : " + totalSize, Toast.LENGTH_SHORT).show();
        return totalSize;
    }

这篇关于在计算总的Andr​​oid应用程序缓存大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆