2010-01-15 10 views
5

Tengo objeto SearchCritiera y lo hago singleton y declaro esta variable como estática, ahora el problema es si dejo mi aplicación abierta por unas horas que el sistema operativo Android quita el objeto estático, ¿cómo puedo asegúrese de que el OS no elimine el objeto estático.Referencia fuerte de Android

como sé que hay pocas palabras claves como

Weekreference y softreference ¿hay alguna palabra clave strongreference que puede decirle sistema operativo Android no quite la referencia ??

Respuesta

3

No utilice referencias estáticas, incluso si su aplicación permanece en primer plano, estos objetos pueden ser destruidos por el recolector de basura (he visto que esto ocurra de un par de veces).

Puede evitar esto simplemente guardándolos en su única instancia Application. Ese objeto está garantizado para vivir tanto como tu aplicación.

1

Lamentablemente, no puede obligar a Android a mantener su aplicación en la memoria. Si el sistema operativo siente que necesita más memoria para una aplicación o servicio en primer plano, se reserva el derecho de finalizar una o todas sus actividades.

Supongo que lo que sucede es que su objeto estático se pierde y se vuelve a crear cuando lo llama, lo que significa que ha perdido su estado. Dicho eso, si tienes una referencia al objeto en primer plano, estoy un poco sorprendido de que se pierda.

Lo mejor que puede hacer para solucionar este problema es anclar en the lifecycle events y guardar el estado de su objeto singleton y restaurarlo cuando corresponda.

Lamentablemente, no hay eventos de ciclo de vida amplio de la aplicación en Androd. Eche un vistazo a this question para saber cómo guardar el estado de la aplicación transitoria.

1

Si no estoy equivocado cuando la aplicación permanece abierta durante mucho tiempo, el SO android lanza datos, y mientras detiene la actividad llamará a "onSaveInstanceState" y cuándo puedo almacenar searchritiera en este método y volverá cuando " onRestoreInstanceState "se llama?

private static SearchCriteria searchCriteria; 


@Override 
    public void onSaveInstanceState(Bundle outState) 
    { 
     outState.putSerializable(WLConstants.SEARCH_CRITERIA, searchCriteria); 
     super.onSaveInstanceState(outState); 
    } 
    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     if(savedInstanceState != null){ 
      searchCriteria = (SearchCriteria) 
      savedInstanceState.getSerializable(WLConstants.SEARCH_CRITERIA); 
     } 
     super.onRestoreInstanceState(savedInstanceState); 
    } 
Cuestiones relacionadas