我的行为很奇怪,我想我更多的是寻找解释而不是解决方案(尽管也欢迎解决方案!)。
这是代码:
PackageManager pm = context.getPackageManager();
List<PackageInfo> pkgList = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
if (pkgList == null)
return null;
for (PackageInfo pkgInfo : pkgList) {
ApplicationInfo appInfo = pkgInfo.applicationInfo;
// do some stuff, doesn't modify pkgInfo or appInfo or pkgList
}
在某些情况下,我会收到以下错误日志:
java.lang.ClassCastException:无法转换为 android.content.pm.PackageInfo
报告线路:
for (PackageInfo pkgInfo : pkgList)
奇怪的是,通常情况下,ClassCastException
通常看起来像(AFAIK):
java.lang.ClassCastException: foo.bar.ClassA不能转换为foo.bar.ClassB
但是,我看到的错误在第一部分显示为空白。
我决定研究一下,如果返回列表的函数在内部转换错误的对象列表并返回它或其他东西,可能会发生这种情况。所以我看了看:
ApplicationPackageManager.getInstalledPackages()
@SuppressWarnings("unchecked")
@Override
public List<PackageInfo> getInstalledPackages(int flags) {
try {
final List<PackageInfo> packageInfos = new ArrayList<PackageInfo>();
PackageInfo lastItem = null;
ParceledListSlice<PackageInfo> slice;
do {
final String lastKey = lastItem != null ? lastItem.packageName : null;
slice = mPM.getInstalledPackages(flags, lastKey);
lastItem = slice.populateList(packageInfos, PackageInfo.CREATOR);
} while (!slice.isLastSlice());
return packageInfos;
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
}
好的,所以返回的列表是从ParceledListSlice.populateList()...
ParceledListSlice.populateList()
public T populateList(List<T> list, Creator<T> creator) {
mParcel.setDataPosition(0);
T item = null;
for (int i = 0; i < mNumItems; i++) {
item = creator.createFromParcel(mParcel);
list.add(item);
}
mParcel.recycle();
mParcel = null;
return item;
}
因此,该项目是从PackageInfo.CREATOR.createFromParcel()
...创建的
最后creator.createFromParcel
的PackageInfo
public static final Parcelable.Creator<PackageInfo> CREATOR
= new Parcelable.Creator<PackageInfo>() {
public PackageInfo createFromParcel(Parcel source) {
return new PackageInfo(source);
}
public PackageInfo[] newArray(int size) {
return new PackageInfo[size];
}
};
所以一切似乎都很好。它正在创建 a ParceledListSlice
of type PackageInfo
,因此populateList
它正在创建一个PackageInfo
项目并将其放入 a List
of 中PackageInfo
,这是返回的列表。所有类型/类对我来说似乎都很好。
所以我的问题,
- 上面的 ClassCastException 怎么会发生?
- 为什么它会显示错误消息的“空白”类型?
- 什么是可能的解决方案?
我正在考虑将列表作为列表Object
并检查“ instanceof
”,但我认为这也行不通,因为它可能最终会说
ClassCastException: cannot be cast into java.lang.Object" 什么的。
任何关于如何发生这种情况的见解和解释将不胜感激。
- Dalvik/JVM 只是搞砸了吗?
- 内存是否损坏?
我只能胡乱猜测=)