在计算总的Android应用程序缓存大小 [英] calculate total app cache size in android
问题描述
我试图来计算所有缓存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;
}
这篇关于在计算总的Android应用程序缓存大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!