7

Después de leer el artículo Avoiding memory leaks de @RomainGuy me di cuenta de que mi aplicación Android actual está plagada con el error de pasar la actividad principal de la aplicación. Entonces cada vez que puedo, simplemente puedo reemplazar ese parámetro de actividad con Activity.getApplicationContext().Patrón de comando para pasar los métodos de actividad de la aplicación?

Pero hay ciertas clases en mi aplicación que aún necesitan ejecutar métodos que solo pueden ser miembros de la actividad principal de las aplicaciones.

Por lo tanto, estaba pensando en posiblemente utilizar el Command Pattern para solucionar este problema.

El problema es que, si nos fijamos en ese ejemplo:

public class SomeCommandExecuableOnlyByActivity implements Command 
{ 
    public void execute(Object data) 
    { 
     doIt(((MyActivity)data).getWindow()); 
    }  
} 

estoy corriendo otra vez en el callejón sin salida del que necesita el pase alrededor de la actividad (esta vez disfrazado de Object datos).

¿Cómo salgo de esta situación de "pollo & el huevo"?

¿Hay una mejor manera de abordar este problema?

+6

No hay nada en ese artículo que afirma que "pasar la actividad principal de la aplicación en torno a" es un error. Ponerlo en miembros de datos estáticos * * es un error, y ese es el tema central detrás de sus primeros y terceros balas en la parte inferior del artículo. En mi humilde opinión, solo use 'Aplicación' cuando sepa específica y precisamente por qué lo está usando. No es un reemplazo general para 'Activity', particularmente para el trabajo de UI. – CommonsWare

+2

@CommonsWare Gracias por señalar esta importante diferencia. En mi caso, conservo un miembro de datos SharedPreferences estático en mi actividad principal para acceder fácilmente a los distintos módulos de la aplicación. De modo que puedo acceder a las preferencias compartidas evitando pasar la Actividad principal como parámetro: 'MainActivity.staticPrefs'. ¿Esto se considera "* Poniéndolo en miembros de datos estáticos *"? – ih8ie8

+1

Esa es una buena pregunta. Dado que 'SharedPreferences' es una interfaz, y no veo fácilmente dónde está la implementación concreta, no lo sé. Si el 'SharedPreferences' se sostiene sobre una' Context' - y puede ser que - entonces sería o bien tendrá que usar 'Application' o evitar el miembro de datos estático. Esperaría que 'Application' funcionara bien con' SharedPreferences'. – CommonsWare

Respuesta

3

Creo que lo que puede faltar aquí es una separación adecuada de las preocupaciones. Si usted dice que tiene que pasar su actividad principal en torno a otras actividades con el fin de invocar algunas funciones en él, entonces me parece que la arquitectura de su aplicación tiene algunos defectos de diseño fundamentales.

Ya sea que use o no el patrón de comando aquí, no puedo decirlo, pero lo que generalmente haría es identificar los métodos que requieren acceso compartido, moverlos a una clase separada y luego mantener una instancia separada de esa clase en todas las actividades que requieren esta funcionalidad, o si necesita compartir estado de la instancia, lo crea en el contexto de aplicación global y proporcionar una ruta de acceso global a ella (no deseable, pero sin un marco DI como RoboGuice que es muy difícil de implementar DI en Android, ya que los constructores se invalidan.)

En mi opinión, en una aplicación de Android bien diseñada, una actividad no tiene lógica comercial y solo proporciona operaciones que cambian el estado de la interfaz de usuario. El flujo de la interfaz de usuario o cualquier otro cálculo quedaría en otras clases. El Model-View-Presenter pattern ayuda tremendamente aquí para mantener su código estructurado por responsabilidad.

Sin darnos más información sobre lo que exactamente está tratando de lograr, es difícil dar consejos específicos.

Cuestiones relacionadas