我在Android上遇到ClassCastException的奇怪问题。一个类不能转换为同一个类:
java.lang.RuntimeException: Unable to start activity ComponentInfo: java.lang.ClassCastException: com.example.model.BadeWrapper cannot be cast to com.example.model.BadgeWrapper
java.lang.ClassCastException: com.example.events.widgets.TouchyWebView cannot be cast to com.example.events.widgets.TouchyWebView
java.lang.ClassCastException: com.example.friends.widgets.FriendsTabView cannot be cast to com.example.friends.widgets.FriendsTabView
当我发现有错误的行时,它只是通过id查找视图或使用参数创建片段,例如:
FriendsTabView friendsTabView;
friendsTabView = (FriendsTabView) view.findViewById(R.id.friends_bottom_tab_panel);
正如我的BugSense所说,这个问题只发生在带有android 5.0.0(三星SM-G900F)的三星Galaxy S5上。我在其他设备上从未遇到过这个问题:
之前有人遇到过这个问题吗?有没有办法解决它?
答案 0 :(得分:25)
好的我问题出在哪里。看起来Android 5.0上的三星可能仍然使用旧的multidex实现(在Android L预览中使用),因此如果你的应用超过64k限制,它会在您使用(ExampleClass) object
强制转换的应用中的随机位置崩溃。
我们每天都会看到这次崩溃发生数千次。 Crashlytics报告崩溃为100%三星设备(99%" SM G900F [Q]"设备)和100%Android 5.x.似乎是三星+棒棒糖设备上的另一个多指标问题,正如a.jaskev报告的那样#3。
看起来我们要等到三星解决这个问题。现在我们所能做的就是通过错误报告观察邮箱上的垃圾邮件:)
答案 1 :(得分:-1)
实际上有一个解决方案。
三星使用makeDexElements
方法的修改版本(附加参数),解决方法是修改MultiDex的源代码,仅为此模型调用它:
/**
* A wrapper around
* {@code private static final dalvik.system.DexPathList#makeDexElements}.
*/
private static Object[] makeDexElements(
Object dexPathList, ArrayList<File> files, File optimizedDirectory,
ArrayList<IOException> suppressedExceptions)
throws IllegalAccessException, InvocationTargetException,
NoSuchMethodException {
Method makeDexElements = findMethod(dexPathList, "makeDexElements", ArrayList.class, File.class, ArrayList.class, ClassLoader.class);
makeDexElements.setAccessible(true);
return (Object[]) makeDexElements.invoke(dexPathList, files, optimizedDirectory, suppressedExceptions,
SamsungS5.class.getClassLoader());
}