Ho un'applicazione Android in cui aggiungo un altro enum:Android "java.lang.RuntimeException: Parcelable encounteredClassNotFoundException lettura di un oggetto Serializable"
public enum RootNavigationOption {
HOME(R.string.home, R.drawable.ic_home), SETTINGS(R.string.settings, R.drawable.ic_settings), LOGOUT(
R.string.logout_label, R.drawable.ic_logout);
private int navigationOptionLabelResId;
private int navigationOptionImageResId;
private RootNavigationOption(int navigationOptionLabelResId, int navigationOptionImageResId) {
this.navigationOptionLabelResId = navigationOptionLabelResId;
this.navigationOptionImageResId = navigationOptionImageResId;
}
public int getNavigationOptionLabelResId() {
return navigationOptionLabelResId;
}
public int getNavigationOptionImageResId() {
return navigationOptionImageResId;
}
public static int getValuePosition(RootNavigationOption filterOption) {
int idx = 0;
for (RootNavigationOption navigationOptionIter : values()) {
if (navigationOptionIter.equals(filterOption)) {
return idx;
}
idx++;
}
return 0;
}
}
ho messo in questo enum e lo mise in un paio di intenti pacchetti per la comunicazione alla mia attività principale. Ho già uno di questi enum
nella mia soluzione, che non causa alcun problema. Tuttavia, quando faccio funzionare la mia applicazione con questa nuova enum
in fase di definizione, si blocca immediatamente con:
java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object (name = com.pack1.pack2.pack3.helpers.RootNavigationOption)
at android.os.Parcel.readSerializable(Parcel.java:2219)
at android.os.Parcel.readValue(Parcel.java:2064)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
at android.os.Bundle.unparcel(Bundle.java:249)
at android.os.Bundle.getString(Bundle.java:1118)
at android.app.ActivityOptions.<init>(ActivityOptions.java:310)
at com.android.server.am.ActivityRecord.updateOptionsLocked(ActivityRecord.java:668)
at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:1778)
at com.android.server.am.ActivityStackSupervisor.startActivityUncheckedLocked(ActivityStackSupervisor.java:1769)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1249)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:741)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3118)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3104)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:135)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2071)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
Caused by: java.lang.ClassNotFoundException: com.pack1.pack2.pack3.helpers.RootNavigationOption
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2262)
at java.io.ObjectInputStream.readEnumDescInternal(ObjectInputStream.java:1553)
at java.io.ObjectInputStream.readEnumDesc(ObjectInputStream.java:1534)
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1579)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:768)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
at android.os.Parcel.readSerializable(Parcel.java:2213)
... 16 more
Caused by: java.lang.NoClassDefFoundError: com/pack1/pack2/pack3/helpers/RootNavigationOption
... 26 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.pack1.pack2.pack3.helpers.RootNavigationOption" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
... 26 more
io non sono in grado di trovare il casue radice del problema. Ho anche preso in considerazione i seguenti post, senza alcun risultato:
- post1 - Non sto utilizzando alcun caricatore cusotm.
- post2 - sto eseguendo l'applicazione direttamente da ADT, nessun proguard coinvolto.
anche io ho:
- controllato il mio classi nella cartella
bin
e la classe necessaria è in là. - decompilato l'apk pronto con apktool e la rispettiva Smali è anche lì
EDIT
Ora sono assolutamente certo che l'eccezione è effettivamente causato da mettendo il valore enum in un fascio utilizzato per iniziare l'attività, anche se queste righe non sono menzionati nel stacktrace:
Bundle activityOptions = new Bundle();
activityOptions.putSerializable(Constants.VIEW_MODE, RootNavigationOption.HOME);
Intent intent = new Intent(this, MainActivity.class);
ho cambiato la logica della mia domanda non utilizzare questo valore enum in Bundle
solo per es. come parametro metodo e ora funziona senza eccezioni. Qualcuno ha la più pallida idea del perché questo accada?
Ho anche messo una taglia sulla domanda ora, perché sono più perplesso.
'sul percorso: DexPathList [ ""[Directory], nativeLibraryDirectories = [/ system/lib]]', ma si dice che la classe memorizzato nella cartella 'bin'? – BNK
Questo è un po 'strano, secondo la documentazione di Enum dice che è serializzabile. http://developer.android.com/reference/java/lang/Enum.html – JoxTraex
@JoxTraex non solo: utilizzo correttamente un altro enum in un pacchetto (ma è un parametro di un frammento) –