2012-03-16 33 views
7

Me preguntaba por qué Google lo hace tan difícil para pasar la lista de objetos alrededor, de 1 actividad a otra actividad, aunque mis actividades son todo dentro de un solo proceso?Por qué es tan engorroso pasar la lista de objetos de una actividad a otra actividad

Por qué no pueden simplemente tener algo como

intent.putExtra("histories", listOfHistoryObjects); 

Están excesivamente el diseño?

Respuesta

6

Una de las razones:

  1. Actividad A inicia la actividad B, manejando un argumento que es un puntero directo a un objeto.
  2. El usuario presiona Inicio.
  3. Su proceso se cancela mientras está en segundo plano.
  4. El usuario vuelve a su aplicación.
  5. La actividad B ahora se vuelve a crear.
  6. Ooops, el argumento del objeto que se suponía que se estaba ejecutando ya no existe.

Otra razón:

Las actividades son componentes de alto nivel que representan las principales partes de la aplicación. La plataforma los gestiona para usted en todos los procesos; ya sea que la actividad A y B se ejecuten en el mismo proceso, todo lo que proporcione a startActivity() debe pasar por IPC para el proceso del sistema, y ​​el proceso del sistema mantiene el estado de esa actividad y la devuelve a su proceso cuando la actividad B necesita ser creado También mantiene esto durante los relanzamientos de su proceso. No podría hacer nada de esto si permitiera cualquier objeto de Java arbitrario que no se pudiera transportar a través de los límites de IPC.

Si tiene elementos de su UI estrechamente acoplados, puede usar Fragment para implementar las partes separadas de su UI. Esta clase no es una parte de alto nivel de su aplicación y no proporciona ningún soporte para el uso en todos los procesos, por lo que facilita la interacción directa entre fragmentos o fragmentos y su actividad.

Dicho esto ... esto aún no elimina la necesidad de que trabaje correctamente en el primer caso.Si no va a utilizar los argumentos basados ​​en Bundle para fragmentos (que permiten que el sistema se encargue automáticamente de mantener esos datos en las instancias de proceso), deberá tener cuidado de implementar onSaveInstanceState y tal para recrear correctamente su fragmentos en su estado apropiado.

También por favor no utilice use Serializable para almacenar objetos en un paquete o paquete. Como dice la documentación en http://developer.android.com/reference/android/os/Parcel.html#writeSerializable(java.io.Serializable), estos son tremendamente ineficaces en comparación con la implementación Parcelable (o incluso el simple uso de las primitivas incorporadas en un paquete).

+0

+1 para su lista de viñetas, pero tengo que estar en desacuerdo cuando se trata de serializar objetos en algunas situaciones. Básicamente se reduce a cada caso. En algunos casos, el nivel de ineficiencia es insignificante y simplemente descartar el enfoque no está realmente justificado. – Squonk

+1

Poner los contenidos en un paquete probablemente será más eficiente. – hackbod

0

Creo que solo necesita implementa la interfaz Serializable en su clase.

Y después de que se puede escribir directamente:

intent.putExtra("histories", listOfHistoryObjects); 

Marque esta example para la descripción detallada.

+0

El enlace está muerto. –

+0

@YanChengCHEOK Acabo de comprobarlo ... está funcionando correctamente. –

1

Siempre y cuando permanezca en un solo proceso, puede simplemente pasar objetos por referencia utilizando técnicas standart java. SIN NECESIDADES, y el contenedor singleton está bien en Android.

Cuestiones relacionadas