2011-11-05 20 views
7

Tuve una mala experiencia con static class variables ya que sus valores se pierden cuando la clase se descarga. Por lo tanto, los evito todos juntos.¿Necesito restaurar todas las variables onResume?

Ahora estoy (probablemente excesivamente) preocupado incluso con variables "normales".

No estoy seguro de si su valor también podría perderse en ciertas circunstancias como interrupciones por una llamada, poca memoria o cualquier otra cosa.

¿Puedo confiar en las variables tienen sus valores de 100%? o

¿me aseguro de algún tipo de restauración válida para todas las variables de actividad?

Gracias!

Respuesta

19

Tuve una mala experiencia con las variables de clase estáticas ya que sus valores se pierden cuando la clase se descarga.

Las clases no "descargan". Your process will be terminated en algún momento después de no tener nada en primer plano, cuando Android necesita recuperar memoria.

¿Puedo confiar en que las variables mantienen sus valores al 100%? ¿o garantizo algún tipo de restauración válida para todas las variables de actividad?

actividades son notificados de cuando se mueven fuera del primer plano por una llamada a onPause(). Desde el punto de vista de esa actividad, en cualquier momento después de onPause() hasta (posiblemente) un correspondiente onResume(), el proceso puede finalizar y la actividad puede perderse.

Tienes que relajarte y pensar en tu modelo de datos. Supongamos que el usuario abandona su aplicación (por ejemplo, presiona INICIO) y no regresa a su aplicación durante una hora, un día o un mes. Se debe guardar cualquier dato que el usuario pueda razonablemente esperar durante ese período de tiempo en un almacén de datos persistente, como una base de datos o archivo sin formato. Es su trabajo determinar cuándo se guardan esos datos, quizás cuando el usuario presiona un botón Guardar, o tal vez está en onPause() de una actividad, o tal vez en otro momento.

de datos que está ligado al contenido actual de la pantalla, pero no tiene por qué ser guardado para un mes de ausencia, puede ser sujetado a través de onSaveInstanceState(). Es de esperar que ya esté usando esto para manejar rotaciones de pantalla. Si es así, y si el usuario abandona su actividad pero de manera que pueda volver a ella mediante el botón ATRÁS (por ejemplo, entra una llamada telefónica, aparece un mensaje de texto y luego hace clic en un enlace en un mensaje de texto y abrir el navegador web, y más tarde VOLVER hasta su aplicación, que se había terminado mientras tanto), se restaurará el estado de su instancia guardada.

Todo lo demás (miembros de datos de instancias de una actividad, miembros de datos estáticos o lo que sea) pueden perderse si el usuario abandona la aplicación, si Android elige finalizar su proceso. Por lo tanto, los miembros de datos estáticos normalmente solo se usan para cachés de corto plazo o para cosas que no importan si se pierden cuando el usuario presiona INICIO o recibe una llamada telefónica o lo que sea.

+0

Mi aplicación se colgó con una NullPointerExpection al comparar dos variables de clase estáticas: Ax == Bx Dado que estoy 100% seguro de que los valores no se pueden establecer como nulos desde la aplicación, hice esta pregunta y obtuve respuestas explicando esto con un " Descargar "causando que las variables estáticas se vuelvan nulas. Así que implementé la clase A como un singleton con constantes globales. Todos los valores de clase B ahora guardo en una base de datos. El punto es, ¿debería restaurar todos mis valores críticos de DB en onResume? ¿Dónde puedo leer los detalles sobre lo que explicaste? Ya que no estoy seguro de haber entendido todo lo suficientemente bien. ¡Gracias! – user387184

+0

ps ¿hay alguna manera de probar estos casos "especiales"? ¿Qué sucede si la interrupción de mi aplicación ocurre en el medio de algo ANTES de guardar las variables críticas en el DB? ¿O se invocará onPause para que pueda garantizar el guardado de los valores en onPause? De lo contrario, quién sabe, la base de datos podría corromperse fácilmente si una parte se ha guardado mientras que la otra no se debe a esta interrupción. ¡Gracias de nuevo! – user387184

+0

@ user387184: "El punto es, ¿debo restaurar todos mis valores críticos desde DB en onResume?" ¿Cómo se supone que debo saber? Es tu aplicación, no la mía. "¿Dónde puedo leer los detalles sobre lo que explicaste? Ya que no estoy seguro de haber entendido todo lo suficientemente bien". - Me vinculé para procesar los documentos del ciclo de vida en la respuesta. Aquí hay documentos del ciclo de vida de la actividad: http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle. "¿O siempre se llamará onPause para asegurarme de guardar los valores en onPause?" - 'onPause()' se llamará bloqueando la salida de la batería del usuario. – CommonsWare

0

Las variables normales persisten, pero el problema es que nunca se puede estar seguro cuando está en Reescritura y cuando está en Creación (ya que no tiene control sobre cuándo se va Android y arroja cosas en la pila por la ventana. .. cualquier cosa que no se esté utilizando actualmente es elegible para la destrucción).

Entonces ... su mejor opción es guardar cosas de cualquier manera que tenga sentido si REALMENTE las necesita entre lugares donde lógicamente alguien podría poner el dispositivo en modo de suspensión, rotarlo, recibir una llamada telefónica o cualquier otra cosa que interrumpe su TOP (ness).

Realmente no me gusta la forma en que funciona el paquete, así que he estado almacenando mis cosas en un objeto JSON que convierto en cadena y solo guardo como una cadena SharedPreference plana (tenga en cuenta que SP persiste para siempre, mientras que su paquete se lanzará junto con todo lo demás una vez que su aplicación sea GCed). De esa forma, puedo tomar eso cuando quiera, en lugar de tener que buscar otros mil millones de elementos Bundle diferentes, pero obviamente es una cuestión de gusto. Hay un poco más de trabajo por adelantado y, por supuesto, un poco más de sobrecarga en la serialización/deserialización, pero como solo ocurre en la rara instancia en que se destruyen mis variables, realmente no es algo de qué preocuparse (a menos que tengas cantidades masivas de datos, en cuyo caso debe usar una base de datos, de todos modos).

Cuestiones relacionadas