Pregunta

Estoy trabajando en una aplicación para Android bastante complejo que requiere una cierta gran cantidad de datos acerca de la aplicación (yo diría que un total de alrededor de 500 KB - esto es grande para un dispositivo móvil?). De lo que puedo decir, cualquier cambio de orientación en la aplicación (en la actividad, para ser más precisos) provoca una destrucción completa y la recreación de la actividad. Sobre la base de mis hallazgos, la clase de aplicación no tiene el mismo ciclo de vida (es decir, que es, para todos los efectos, siempre instanciado). ¿Tiene sentido para almacenar la información en el interior del estado de la clase de aplicación y luego hacer referencia a partir de la actividad, o es que no suele ser el método de "aceptable" debido a las limitaciones de memoria en los dispositivos móviles? Realmente aprecio cualquier consejo sobre este tema. Gracias!

¿Fue útil?

Solución

No creo 500kb será tan grande de un acuerdo.

Lo que usted describe es exactamente cómo abordé mi problema de pérdida de datos en una actividad. He creado un producto único global en la clase de aplicaciones y fue capaz de acceder a él desde las actividades que he usado.

Puede pasar los datos en torno a un Singleton global si se va a utilizar mucho.

public class YourApplication extends Application 
{     
     public SomeDataClass data = new SomeDataClass();
}

A continuación, llamar en cualquier actividad por:

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

Lo discuto aquí en mi blog , en la sección "Global Singleton."

Otros consejos

Los que cuentan en la instancia Application están equivocados. Al principio, puede parecer como si existe la Application durante el tiempo que existe todo el proceso de aplicación, pero esto es una suposición incorrecta.

El sistema operativo puede matar procesos que sean necesarios. Todos los procesos se dividen en 5 niveles de "killability" especificado en el doc .

Así, por ejemplo, si su aplicación va en el fondo debido a la respuesta del usuario a una llamada entrante, a continuación, en función del estado de la memoria RAM, el sistema operativo puede (o no) matar a su proceso (destruyendo la instancia Application en el proceso).

creo que un mejor enfoque sería persistir sus datos al archivo de almacenamiento interno y luego leyó cuando su actividad se reanuda.

ACTUALIZACIÓN:

Tengo muchas reacciones negativas, por lo que es el momento de añadir una aclaración. :) Bueno, al principio yo realmente usó una suposición errónea de que el estado es muy importante para la aplicación. Sin embargo, si la aplicación está bien que a veces se pierde el estado (que podría ser algunas imágenes que serán acabo de releer / redownloaded), entonces es totalmente bien para mantenerlo como miembro del Application.

Si desea tener acceso a la parte exterior "Global Singleton" de una actividad y no desea pasar el Context a través de todos los objetos involucrados para obtener el producto único, sólo puede definir un atributo estático en la clase de aplicación, los cuales mantiene la referencia a sí mismo. Sólo inicializar el atributo en el método onCreate().

Por ejemplo:

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

Debido a las subclases de Application también pueden obtener los recursos, se puede acceder a ellos, simplemente, cuando se define un método estático, que los devuelve, como:

public static Resources getAppResources()
{
    return _appCtrl.getResources();
}

Pero tenga mucho cuidado al pasar alrededor de las referencias de contexto para href="http://developer.android.com/resources/articles/avoiding-memory-leaks.html" .

a Dave, qué tipo de datos es? Si se trata de datos generales que se refiere a la aplicación como un todo (por ejemplo: datos de usuario), entonces se extienden la clase de aplicación y lo almacenan allí. Si los datos pertenece a la actividad, se debe utilizar el onSaveInstanceState y manipuladores onRestoreInstanceState persistir los datos sobre la rotación de pantalla.

En realidad se puede reemplazar la funcionalidad de orientación para asegurarse de que su actividad no se destruye y vuelve a crear. Mirada aquí .

Se puede crear la clase de aplicaciones y guardar todos los datos en que las llamadas para nosotros que cualquier lugar de su aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top