Paso de parámetros por Parcelables

En otros tutoriales anteriores ya vimos como pasar fácilmente objetos como parámetros haciendo la clase Serializable, hoy veremos como hacerlo con Parcelable.

¿Por qué existen dos métodos para hacer una misma cosa? muy sencillo Serializable viene heredado de Java, y Parcelable está creado por los chicos de Google, por lo tanto ya estaréis intuyendo que este ultimo está optimizado para Android, pues si habéis pensado eso habéis dado en el clavo.

Cuando digo que es mas eficiente no lo digo en broma, es brutalmente mas liviano que Serializable, por contrapartida es un poco más complicado de implementar, pero a fin de cuentas bastante sencillo.

Vamos con un ejemplo. Al igual que con Serializable, enviaríamos el objeto desde la clase origen así:

Intent intent = new Intent(Activity_Origen.this, Activity_Destino.class); intent.putExtra("parametro", ObjetoNoticia); startActivity(intent); Diferenciándose un poco a la hora de recogerlo: articulo = getIntent().getParcelableExtra("parametro");Así tendríamos nuestro objeto en la nueva Activity de una forma mucho más eficiente.

Veamos ahora como dejar lista nuestra clase para que esto funcione.

Primero tendremos que implementar "Parcelable" en nuestra clase, y generar los dos métodos que nos obliga "describeContents" y "writeToParcel" además de un "readFromParcel" para tenerlo todo ordenado: [...] public class Noticia_parcel implements Parcelable { [...] @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { } private void readFromParcel(Parcel in) { } [...] No es necesario, pero por comodidad os aconsejo crearos dos constructores, uno vació y otro que reciba un "Parcel": public Noticia_parcel (){ } public Noticia_parcel (Parcel in){ readFromParcel(in); } Ya solo nos falta el "Creator", que nos va a permitir crear listas tipadas entre otras cosas: public static final Parcelable.Creator<Noticia_parcel> CREATOR = new Parcelable.Creator<Noticia_parcel>() { public Noticia_parcel createFromParcel(Parcel in) { return new Noticia_parcel(in); } public Noticia_parcel[] newArray(int size) { return new Noticia_parcel[size]; } }; Implementamos los métodos "writeToParcel" y "readFromParcel". Es importante que se escriba y se lea en el mismo orden: @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(titulo); dest.writeString(contenido); dest.writeString(resumen); dest.writeString(enlace); dest.writeString(imagen); } private void readFromParcel(Parcel in) { titulo = in.readString(); contenido = in.readString(); resumen = in.readString(); enlace = in.readString(); imagen = in.readString(); } Y ya tendríamos todo listo. Os pongo la clase completa para que lo veáis en conjunto: public class Noticia_parcel implements Parcelable { private String titulo; private String contenido; private String resumen; private String enlace; private String imagen; public void setTitulo(String title) { this.titulo = title; } public void setContenido(String content) { this.contenido = content; } public void setResumen(String text) { this.resumen = text; } public void setEnlace(String url) { this.enlace = url; } public void setImage(String image) { this.imagen = image; } public String getTitulo() { return this.titulo; } public String getContenido() { return this.contenido; } public String getResumen() { return this.resumen; } public String getEnlace() { return this.enlace; } public String getImagen() { return this.imagen; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(titulo); dest.writeString(contenido); dest.writeString(resumen); dest.writeString(enlace); dest.writeString(imagen); } private void readFromParcel(Parcel in) { titulo = in.readString(); contenido = in.readString(); resumen = in.readString(); enlace = in.readString(); imagen = in.readString(); } public Noticia_parcel (){ } public Noticia_parcel (Parcel in){ readFromParcel(in); } public static final Parcelable.Creator<Noticia_parcel> CREATOR = new Parcelable.Creator<Noticia_parcel>() { public Noticia_parcel createFromParcel(Parcel in) { return new Noticia_parcel(in); } public Noticia_parcel[] newArray(int size) { return new Noticia_parcel[size]; } }; } Si os ha gustado, ¡no os olvidéis de compartirlo! y si tenéis dudas, usad los comentarios, no mordemos =D.