Entendiendo Parcelable y como usarlo en Android
14
mayo
2017

Vamos aumentando en la familia de los tutoriales, hoy voy a intentar explicarlos qué es Parcelable y cómo usarlo en Android, así que vamos allá.

Primero debéis saber qué es Parcerable, es una interfaz del lenguaje de programación Android.

Vale ahora que ya sabemos algo (el que no sepa que es una interfaz) definamos algunos conceptos más y veamos para qué puede servir Parcelable.

  • El uso de Parcelable es para clases cuyas instancias pueden ser escritas y restauradas de un Parcel.
  • Un Parcel es una clase contenedora (de datos y referencias a objetos) que puede ser enviada a través de un IBinder. (No vamos a entrar en que es un IBinder).
  • Para ser exactos Parcel no es un mecanismo de serialización sino un mecanismo para hacer IPC (Comunicación entre procesos) de una forma eficiente y rápida, si serializais un objeto Parcel puede que obtengáis datos inconsistentes al deserializarlo.

 

Con estos conceptos de qué vamos a manejar en nuestra clase que va a implementar Parcelable, podemos hacer la siguiente deducción:

Según hemos dicho antes Parcelable nos va a ayudar a pasar objetos Parcel entre clases de una manera eficiente, por lo que si yo tengo una clase que implementa Parcelable puede pasar esos objetos a través de un Bundle de una Activity o Fragment a otra distinta de forma que el objeto de mi clase llegue con todos sus campos a la otra Activity por medio de un Intent por ejemplo.

La teoría muy chula, pero cómo lo hago en el código, pues os he preparado un pequeño GIF que puede ayudaros:

Si os habéis fijado en el GIF tengo una variable fecha que el IDE Android Studio no me ha ayudado a escribirla y leerla de un Parcel, bien una de las soluciones que he encontrado a esto de como hacer que un objeto Date pueda ser un Parcel es la siguiente:

Con el ejemplo de antes tendríamos solamente que añadir las siguientes líneas resaltadas en rojo:

protected Obra(Parcel in) {
    id = in.readInt();
    titulo = in.readString();
    fecha = new Date(in.readLong());
    descripcion = in.readString();
    urlImagen = in.readParcelable(Uri.class.getClassLoader());
    puntos = in.readInt();
    tipo = in.readString();
    encontrada = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(titulo);
    dest.writeLong(fecha.getTime());
    dest.writeString(descripcion);
    dest.writeParcelable(urlImagen, flags);
    dest.writeInt(puntos);
    dest.writeString(tipo);
    dest.writeString(encontrada);
}

Con esto hemos conseguido pasar nuestro objeto Date a través de un Parcel, según pone en la documentación los objetos que queramos pasar que no estén definidos ni en Parcel.write ni en Parcel.read podremos obtenerlos a través de datos primitivos como ha pasado en este caso con Date que al fin y al cabo no es más que un Long.

Una advertencia que os doy si queréis pasar un Array de objetos Parcel a través de un Bundle al final o vais a tener que pasar por el tipo Array básico de Java o por el tipo ArrayList ya que no hay otro tipo de objetos de tipo array que permita pasar un Bundle siendo estos Parcel. Un ejemplo en un Fragment:

//ArrayList de obras para cargar y pasar cuando se cambie de Fragment
private ArrayList<Obra> obras = new ArrayList<>();

// TODO: Rename and change types and number of parameters
public static Inicio newInstance(ArrayList<Obra> obras) {
    Inicio fragment = new Inicio();
    Bundle args = new Bundle();
    args.putParcelableArrayList("obras", obras);
    fragment.setArguments(args);
    return fragment;
}

Hasta aquí ha llegado el tutorial de cómo usar Parcelable espero que os haya servido de utilidad, comentad si tenéis alguna duda.

Un saludo!

Referencias:

Tutorial muy útil de cómo pasar datos entre fragment:

Parte 1 -> Esta parte habla de los listener que tendríais que usar para comunicar los fragments y las activitys que los contienen

Parte 2 -> Esta es la parte relacionada con los parcelables sobre el minuto 9:50 comienza a hablar de ellos.

Para usar fechas en parcelable: http://stackoverflow.com/questions/21017404/reading-and-writing-java-util-date-from-parcelable-class

Definición de interfaz: https://es.wikipedia.org/wiki/Interfaz_(Java)

Qué es Parcelable: https://developer.android.com/reference/android/os/Parcelable.html

Qué es Parcel: https://developer.android.com/reference/android/os/Parcel.html

Qué es Bundle: https://developer.android.com/reference/android/os/Bundle.html

  • 1222 View
  • Comenta!

    Loading Facebook Comments ...
    Leave a Comment