Android上的同类的类强制转换异常

时间:2015-03-12 10:29:35

标签: android classcastexception findviewbyid

我在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上。我在其他设备上从未遇到过这个问题:

  • 摩托罗拉Moto G第一代(Android 5.0.1)
  • 三星Galaxy S3 Mini(Android 4.1.2)
  • LG G2 Mini(Android 4.4.2)
  • Sony Xperia L(Android 4.1.2)

之前有人遇到过这个问题吗?有没有办法解决它?

2 个答案:

答案 0 :(得分:25)

好的我问题出在哪里。看起来Android 5.0上的三星可能仍然使用旧的multidex实现(在Android L预览中使用),因此如果你的应用超过64k限制,它会在您使用(ExampleClass) object强制转换的应用中的随机位置崩溃。

有关此问题的更多信息,请访问herehere

  

我们每天都会看到这次崩溃发生数千次。 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());
    }