2010-11-26 14 views
32

Por lo que puedo ver onRetainNonConfigurationInstance es una devolución de llamada redundante. Si mi actividad tiene una inicialización realmente cara, me conviene más usar onSaveInstanceState. La instancia guardada cubre más situaciones que la instancia sin configuración. ¿Hay alguna guía para usar una API vs. la otra? Gracias.¿Cuál usar: onSaveInstanceState vs. onRetainNonConfigurationInstance?

Respuesta

45

Por lo que puedo ver enRetainNonConfigurationInstance es una devolución de llamada redundante.

No, no lo es.

Si mi actividad tiene una inicialización realmente cara, me conviene más utilizar onSaveInstanceState.

onSaveInstanceState() no está diseñado para una "inicialización realmente costosa". Está diseñado para "hey, el usuario realizó algunos cambios en la información de la actividad pero aún no la ha guardado, no perdamos esa información, ¿no?".

¿Hay alguna pauta para utilizar una API frente a la otra?

Si cabe en un Bundle y no es demasiado grande, use onSaveInstanceState(). Todo lo que no encaje en un Bundle (por ejemplo, un socket) o es realmente grande (por ejemplo, una foto como Bitmap) debe usar onRetainNonConfigurationInstance(), y su aplicación debería estar en posición de volver a crear esos elementos si es necesario.

+6

@Raj: No, no lo haría. Los dos métodos sirven diferentes roles. 'onSaveInstanceState()' pasa a usarse en cambios de configuración. También sucede que se usa en casos donde Android quiere finalizar el proceso de la aplicación para liberar RAM, pero el usuario puede volver a la actividad (por ejemplo, a través del botón ATRÁS). Esta es la razón por la que Android usa un 'Bundle': se puede convertir en un' byte [] 'y enviar a través de los límites del proceso. Android se queda con el 'byte []' hasta el momento en que sea necesario o hasta que la actividad ya no se pueda acceder a través de BACK. – CommonsWare

+6

@Raj: Sin embargo, dado que un 'Bundle' (o lo que sea' onSaveInstanceState() ') debe transportarse a través de los límites del proceso, aún nos faltan maneras de manejar cosas que queremos conservar para un cambio de configuración pero que no pueden entrar en un 'Bundle', como un socket. Para eso, hay 'onRetainNonConfigurationInstance()', que solo se usa en los casos en que el proceso * no * se terminará, y así podemos pasar objetos arbitrarios de instancia de actividad nueva a nueva. – CommonsWare

+3

Mi opinión es que onSaveInstanceState() permite guardar datos serializables simples en el almacenamiento persistente a largo plazo. Estos datos se pueden recuperar más adelante, incluso después de que se hayan eliminado los procesos de la aplicación. Por el contrario, onRetainNonConfigurationInstance() le permite guardar cualquier objeto Java con la suposición de que estos objetos serán reutilizados inmediatamente por una nueva instancia de actividad. Por lo tanto, se pueden guardar elementos como AsyncTask y SQLiteDatabse. La clave aquí es crear estos objetos usando la aplicación y no el contexto de la actividad. De lo contrario, la actividad destruida puede no ser recolectada como basura. – Raj