2015-03-12 19 views
19

Ho uno strano problema con ClassCastException su Android. Una classe non può essere colato alla stessa classe:Eccezione cast di classe alla stessa classe su Android

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 

Quando trovo la linea con l'errore, tutto ciò che fa è trovare vista da id o la creazione di frammento con argomenti Es:

FriendsTabView friendsTabView; 
friendsTabView = (FriendsTabView) view.findViewById(R.id.friends_bottom_tab_panel); 

Come il mio BugSense dice, questo problema si verifica solo su Samsung Galaxy S5 con Android 5.0.0 (Samsung SM-G900F). Non ho mai incontrato questo problema sui miei altri dispositivi:

  • Motorola Moto G 1 ° generazione (Android 5.0.1)
  • Samsung Galaxy S3 Mini (Android 4.1.2)
  • LG G2 Mini (Android 4.4 .2)
  • Sony Xperia L (Android 4.1.2)

Chiunque ha incontrato questo problema prima? C'è un modo per risolverlo?

+0

potete inserire le parti pertinenti del layout XML, la classe java per FriendsTabView (se disponibile) e il file java in cui si utilizza questo FriendsTabView? – OcuS

+0

Nevermind, problema è con il dispositivo Samsung Galaxy S5, vedi la mia risposta – rwojcik

risposta

24

Ok I dove il problema è. Sembra che Samsung su Android 5.0 probabilmente usi ancora la vecchia implementazione di multidex (usata nell'anteprima L di Android), quindi se la tua app supera il limite di 64k, si bloccherà in posizioni casuali sulla tua app dove usi la trasmissione (ExampleClass) object.

Ulteriori informazioni su questo problema possono essere trovati here e here.

Stiamo anche vedendo questo incidente si verificano migliaia di volte al giorno. Crashlytics segnala il crash come dispositivi Samsung al 100% (dispositivo 99% "SM G900F [Q]") e Android 5.x al 100%. Sembra essere un altro problema multidex sui dispositivi Samsung + Lollipop, come riporta a.jaskev in # 3.

Sembra che dobbiamo aspettare che Samsung risolva questo problema. In questo momento tutto ciò che possiamo fare è guardare il nostro spam sulla casella di posta con segnalazioni di bug :)

+0

http://www.gsmarena.com/samsung_norway_putting_android_5_for_galaxy_s5_and_s4_on_hold-news-11507.php aggiornamento Ora anche Lolipop è in attesa a causa di questo problema – rwojcik

+0

Samsung: Neppure una volta. –

-1

In realtà c'è una soluzione.

Samsung utilizza versione modificata di makeDexElements metodo (con argomenti aggiuntivi) e la soluzione è quella di modificare il codice sorgente di MultiDex chiamarlo solo per questo modello:

/** 
    * 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()); 
    } 
+0

Questa sarebbe una correzione che si doveva fare sul proprio dispositivo giusto? – FWeigl

+0

@Ascorbin È compito dello sviluppatore applicare patch alla libreria multidex nella sua applicazione – pixel

+0

Dove esattamente si dovrebbe effettuare tale modifica? – FWeigl