ClassCastException al intentar hacer readParcelable en un arreglo de objetos personalizado
Estoy tratando de implementar Parcelable en lugar de Serializble como se supone que es más eficiente. Desde mi MainActivity Quiero pasar un objeto Mensaje a otra actividad, mi clase Mensaje contiene otras clases. Si logro superar este error, estoy seguro de que correré a más de ellos, pero ahora mismo cuando intento ejecutar mi aplicación, estoy recibiendo
Esta es mi clase de mensaje:
- Agregando parcelable a una clase de interfaz para objetos personalizados
- Herencia parcelable: clase abstracta - ¿QUÉ CREADOR?
- ¿Cuál es la diferencia entre Parcelable y Serialization utilizado en android
- No se puede guardar ArrayList de Uri en un archivo: NotSerializableException
- Android | Unmarshalling Tipo desconocido al utilizar datos parcelables en paquetes
import java.util.ArrayList; import android.os.Parcel; import android.os.Parcelable; public class Message implements Parcelable { int id; int space_id; String text; String html; String created_at; int[] comments; boolean is_liked; int[] liked_by; int[] starred_by; boolean is_starred; boolean is_followed; int[] followed_by; ArrayList<AttachmentsData> attachments; String url; int[] tags; boolean is_system; public User created_by; public Permissions persmissions; public Embed embed; public Tokens[] tokens; /** Parcelable **/ public Message(Parcel in) { readFromParcel(in); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeInt(space_id); dest.writeString(text); dest.writeString(html); dest.writeString(created_at); dest.writeIntArray(comments); dest.writeInt(is_liked ? 1 : 0); dest.writeIntArray(liked_by); dest.writeIntArray(starred_by); dest.writeInt(is_starred ? 1 : 0); dest.writeInt(is_followed ? 1 : 0); dest.writeIntArray(followed_by); dest.writeList(attachments); dest.writeString(url); dest.writeIntArray(tags); dest.writeInt(is_system ? 1 : 0); dest.writeParcelable(created_by, flags); dest.writeParcelable(persmissions, flags); dest.writeParcelable(embed, flags); dest.writeParcelableArray(tokens, flags); } private void readFromParcel(Parcel in) { id = in.readInt(); space_id = in.readInt(); text = in.readString(); html = in.readString(); created_at = in.readString(); //in.readIntArray(comments); comments = in.createIntArray(); is_liked = in.readInt() == 0; //in.readIntArray(liked_by); liked_by = in.createIntArray(); //in.readIntArray(starred_by); starred_by = in.createIntArray(); is_starred = in.readInt() == 0; is_followed = in.readInt() == 0; //in.readIntArray(followed_by); followed_by = in.createIntArray(); in.readList(attachments, AttachmentsData.class.getClassLoader()); url = in.readString(); //in.readIntArray(tags); tags = in.createIntArray(); is_system = in.readInt() == 0; created_by = in.readParcelable(User.class.getClassLoader()); persmissions = in.readParcelable(Permissions.class.getClassLoader()); embed = in.readParcelable(Embed.class.getClassLoader()); tokens = in.readParcelable(Tokens.class.getClassLoader(); } public static final Parcelable.Creator<Message> CREATOR = new Parcelable.Creator<Message>() { public Message createFromParcel(Parcel in) { return new Message(in); } public Message[] newArray(int size) { return new Message[size]; } }; /** Getters and setters, I'll spare you these **/ }
Y este es el error que estoy recibiendo:
EXCEPCIÓN FATAL: principal java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo {com.example.incentive / com.example.incentive.Comments}: java.lang.ClassCastException: android.os.Parcelable [] no se puede convertir en com. Ejemplo.incentive.messagemodel.Tokens [] en android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1967) en android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1992) en android.app.ActivityThread.access $ 600 (ActivityThread .java: 127) en android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1158) en android.os.Handler.dispatchMessage (Handler.java:99) en android.os.Looper.loop (Looper.java: 137) en android.app.ActivityThread.main (ActivityThread.java:4441) en java.lang.reflect.Method.invokeNative (Método nativo) en java.lang.reflect.Method.invoke (Method.java:511) at com .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:784) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:551) en dalvik.system.NativeStart.main (Método nativo) Causado por: java.lang.ClassCastException: android.os.Parcelable [] no se puede convertir en com.example.incentive.messagemodel.Tokens [] en com.example.incentive.messagemodel.Message.readFromParcel (Message. Java: 94) at com.example.incentive.messagemodel.Message. (Message.java:35) at com.example.incentive.messagemodel.Message $ 1.createFromParcel (Message.java:100) at com.example.incentive.messagemodel .Message $ 1.createFromParcel (Message.java:1) en android.os.Parcel.readParcelable (Parcel.java:1992) en android.os.Parcel.readValue (Parcel.java:1854) en android.os.Parcel.readMapInternal (Parcel.java:2094) en android.os.Bundle.unparcel (Bundle.java:223) en android.os.Bundle.getParcelable (Bundle.java:1158) en com.example.incentive.Comments.onCreate (Comentarios. Java: 67) en android.app.Activity.performCreate (Activity.java:4465) en android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1049) en android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1931). .. 11 más
Estoy pensando que el relevante ahora es:
Causado por: java.lang.ClassCastException: android.os.Parcelable [] no se puede convertir en com.example.incentive.messagemodel.Tokens [] en com.example.incentive.messagemodel.Message.readFromParcel (Message.java:94)
Así que probablemente estoy haciendo esto mal: tokens = in.readParcelable (Tokens.class.getClassLoader ();
Aquí está mi clase Tokens:
import android.os.Parcel; import android.os.Parcelable; public class Tokens implements Parcelable { String type; String value; int start; int end; /** Parcelable related **/ @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(type); dest.writeString(value); dest.writeInt(start); dest.writeInt(end); } private Tokens(Parcel in) { type = in.readString(); value = in.readString(); start = in.readInt(); end = in.readInt(); } public static final Parcelable.Creator<Tokens> CREATOR = new Parcelable.Creator<Tokens>() { public Tokens createFromParcel(Parcel in) { return new Tokens(in); } public Tokens[] newArray(int size) { return new Tokens[size]; } }; /** Getters and setters **/ }
He buscado toda la tarde y no puedo ver para encontrar cómo hacerlo correctamente. ¿Alguien sabe?
- Parcel.readException pasando un objeto al servicio remoto
- Ayuda con el paso de ArrayList y la actividad parcelable
- List <String> readStringArray en Parcelable
- Anidado Parcelling: RuntimeException - Unmarshalling tipo desconocido código 3211319 en el desplazamiento 440
- Errores de unmarshalling en la aplicación de Android con clases parcelables personalizadas
- Android.os.TransactionTooLargeException tirado al azar
- ¿Qué cargador de clases usar con Parcel.readHashMap?
- Objetivo y Parcelable objeto Android
Utilice writeTypedArray y readTypedArray para leer y escribir su matriz en la parcela
Leer
tokens = in.createTypedArray(Tokens.CREATOR);
Escribir
in.writeTypedArray(tokens, flags);
prueba esto…
reemplazar
tokens = in.readParcelable(Tokens.class.getClassLoader();
con
tokens = in.readParcelableArray(Tokens.class.getClassLoader());
Está escribiendo Parcelable Array pero lo lee como Parcelable
- Efecto Parallax de Android y View Pager
- ¿Cómo escribir una notificación que hace absolutly nada cuando se hace clic?