2011-10-24 14 views
47

Por lo tanto, mi primera aplicación principal está casi codificada y estoy optimizando mi código. La aplicación funciona bien, pero no estoy seguro de mi forma de pasar el contexto a otras clases. No quiero hacerlo de la manera incorrecta. Me encontré con artículos y preguntas aquí en Stackoverflow sobre contextos y cuál es la forma correcta de pasarlo a clases que no son de actividad. También leo la documentación, pero ser un finlandés hace que la tecnología complicada sea aún más difícil de entender.¿Práctica recomendada para pasar el contexto a clases que no son de actividad?

Entonces, una pregunta simple. ¿Es correcta mi forma de pasar el contexto de mi actividad principal a otras clases (auxiliares)? Si no, ¿dónde puedo leer más sobre mejores prácticas en estas situaciones?

Por ejemplo: MainActivity.java

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle sis){ 
     super(sis); 
     new Helper(MyActivity.this).makeMyAppAwesome(); 
    } 
} 

Helper.java

public class Helper { 
    Context context; 
    Helper(Context ctx){ 
     this.context = ctx; 
    } 

    public void makeMyAppAwesome(){ 
     makeBaconAndEggsWithMeltedCheese(context); 
    } 
} 

¿Está bien? Sería bueno que alguien pudiera proporcionar un artículo fácil de leer con ejemplos sobre este tema.

+3

La regla básica es que no se aferran a un 'Context' más largo que existe el' Context'. –

+0

Ese es uno de los dichos que no estoy seguro de entender.Es obvio que no utilizo el mismo contexto en otra actividad, ¿pero de esto no es probablemente de lo que estás hablando? –

+3

La clave de este refrán, para su ejemplo, es comprender el ciclo de vida de la actividad. Esto evitará fugas de memoria y el uso de una instancia anterior de Actividad (esto no sucederá en su ejemplo). En su ayudante, incluiría una forma de establecer la actividad null en onStop y establecer el valor nuevamente en onStart. –

Respuesta

33

Usted puede hacer que el uso de ContextWrapper, as described here.

Por ejemplo:

public class MyContextWrapper extends ContextWrapper { 

    public MyContextWrapper(Context base) { 
     super(base); 
    } 

    public void makeMyAppAwesome(){ 
     makeBaconAndEggsWithMeltedCheese(this); 
    } 
} 

Y llamar a la clase no actividad como esta de una actividad

new MyContextWrapper(this); 
+1

¡Bienvenido a SO, felicitaciones por proporcionar una mejor respuesta que existe y se acepta en una pregunta popular en su primera publicación! He editado tu respuesta solo para formatear el código correctamente: consulta el enlace de ayuda para obtener más información la próxima vez que respondas. :) – OJFord

+2

No puedo usar esto si mi clase ya extiende alguna otra clase. –

+0

Esto es tan malo como mantener el contexto. Tenga en cuenta que ContextWrapper mantendrá una referencia al contexto. Si está utilizando esto, asegúrese de que el ContextWrapper que crea esté correctamente desreferenciado. –

-3

También podría crear una estática referencia de instancia a su MainActivity inicializado en el método onCreate()

public class MainActivity extends AppCompatActivity { 

    public static MainActivity mMainActivity; 

    @Override 
    private onCreate(Bundle savedInstanceState){ 

    //... 

    mMainActivity = this; 

    } 
} 

y llame el contexto de esta manera:

MainActivity.mMainActivity; 

o escribir un método getInstanceOf() si es más clara y/o prefiere utilizar un descriptor de acceso

MainActivity.getInstanceOf(); 

Esta estrategia se podría proporcionarle cierta flexibilidad si más adelante decide que quiere llamar a un método de instancia que figura en su actividad principal, así:

MainActivity.mMainActivity.myInstanceMethod(); 

Solo una sugerencia. La crítica es bienvenida y alentada.

+0

public static MainActivity mMainActivity; Esto creará una instancia global estática de Actividad y no será basura recolectada, por lo tanto perderá memoria. –

1

Por lo general, lo mejor para usted es simplemente pasar el contexto actual en el momento en que es necesario. Almacenarlo en una variable miembro probablemente genere una pérdida de memoria y empiece a causar problemas a medida que desarrolle más actividades y servicios en su aplicación.

public void iNeedContext(Context context) {... 

También, en cualquier clase que tiene contexto, recomiendo hacer una variable miembro para facilitar la lectura y capacidad de búsqueda, en lugar de pasar directamente o (ClassName.)this. Por ejemplo, en MainActivity.java:

Context mContext = MainActivity.this; 
Activity mActivity = MainActivity.this; 
Cuestiones relacionadas