2012-07-14 13 views
6

Tengo una clase Singleton Data, que utilizo para almacenar datos. Estoy accediendo a ella en diferentes Fragment s.OnSaveInstanceState con Singleton

Cuando se carga la primera Fragment, no hay problema de que todos los campos en Singleton sean null. Cuando se muestra el segundo Fragment, depende de estos campos para mostrar sus datos. El primer Fragment garantiza que estos campos se inicialicen.

Sin embargo, cuando el usuario presiona el botón de inicio en la segunda Fragment, y lo abre de nuevo después de como una hora o así, el Singleton ha perdido todos sus datos y el Fragment intenta acceder null campos.

Quería implementar el método onSaveInstanceState, pero estoy perplejo sobre cómo funciona esto: no tengo ninguna instancia de los datos para asignarlo.

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("DATA", Data.getInstance()); 
} 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    savedInstanceState.getSerializable("DATA"); //What to do with this? 
} 

Cualquier ayuda es bienvenida.

+0

Pero, no estoy seguro de entender por qué el singleton perdería todos sus datos. La aplicación todavía se está ejecutando en segundo plano, ¿no es así? Uso el mismo paradigma en mi aplicación y no he visto esta pérdida de datos. – Aviral

+0

Estoy experimentando este problema, así que supongo que sí. – nhaarman

+0

¡Interesante! Si tiene alguna idea de por qué desaparecen los datos en el singleton, publique. Esto me está causando preocupación. Gracias. – Aviral

Respuesta

1

¿Los fragmentos están alojados en la misma actividad? De ser así, ¿por qué no almacena el estado compartido en un miembro de la Actividad y utiliza las actividades onSaveInstanceState() y onCreate() para guardarlo y restaurarlo? En sus fragmentos a continuación, puede hacer ...

((MyActivityClass)getActivity()).getSharedState() 

lo contrario, podría hacer que su objeto singleton gestionar un objeto miembro que puede ser serializado y deserializar:

MySingleton.instance().saveTo(outState); 
MySingleton.instance().restoreFrom(savedInstanceState); 
MySingleton.instance().getState(); 

Dónde

public void restoreFrom(Bundle savedInstanceState) { 
    mState = savedInstanceState.getSerializable("DATA"); 
} 
+0

Mejor uso Parcable por razones de rendimiento. – Roel

0

Puedes echar un vistazo a this. onSaveInstanceState método no es muy aconsejable si necesita transportar objetos grandes.