entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Duda: Intentando entender el objeto context y Activity

Hola.

Es mas que nada una duda teórica que me ha surgido a la hora de programar. No consigo tener muy claro estos dos tipos de objetos. Os pongo en situación.

Mi intención es que al ejecutar el MainActivity se compruebe si la base de datos ha sido creada. En caso negativo se crea en segundo plano (lanzamos un ProgressDialog ). Aqui es donde me he dado cuenta que no tengo claro el concepto de Context.

Código de MainActivity en el onCreate

    LoadDbAsync task = new LoadDbAsync(this);
    task.execute();

Y código resumido de onPreExecute() en LoadDbAsync.java. mActivity es un objeto de tipo Activity

    pDialog = new ProgressDialog(mActivity);
    pDialog.setMessage("Cargando Base de datos...");
    pDialog.setCancelable(false);
    pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

El constructor de LoadDbAsync

//constructor
 public LoadDbAsync(Activity activity) {
        mActivity = activity;
    }

Este código funciona sin ningún problema.

Pero en cambio el siguiente código no. MainActivity

        LoadDbAsync task = new LoadDbAsync(getApplicationContext());
    task.execute();

onPreExecute() en LoadDbAsync.java

    pDialog = new ProgressDialog(context);
    pDialog.setMessage("Cargando Base de datos...");
    pDialog.setCancelable(false);
    pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

El constructor de LoadDbAsync

 public LoadDbAsync(Context context) {      // TODO Auto-generated
 constructor stub       this.context = context;     }

Me gustaría entender el por qué un código funciona y el otro no.

Saludos.

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola Egoitz,

Context es una interfaz abstracta que el entorno Android instancia para permitir acceder al "contexto" de la aplicación, que es la estructura de nivel superior en una app. Una app Android crea automaicamente un contexto, y todo lo que se ejecuta se hace en el marco de dicho contexto

Por eso el contexto permite lanzar nuevas Activity, escuchar Intents o emitir mensajes en broadcast que serán escuchados por todas las actividades instanciadas, usarlo para "inflar" layouts y por supuesto acceder a los valores del contexto de ejecución.

Una actividad en cambio representa a la instancia de una clase Activity ejecutándose. La Activity tiene todos los recursos que le hayas creado y todo el comportamiento heredado. La Activity se ejecuta dentro del Context.

El por qué el primer código funciona y el segundo no, no lo veo en la porción de código que mostrás. Lo más probable el código falle porque task está usando algún recurso de la Activity que está fuera de su alcance. Compila porque Activity herada de Context (por el Principio de Substitución de Liskov) , pero la instancia del Conetxto no tendrá acceso a los métodos de la Activity.

Hay documentación acá:
http://developer.android.com/reference/android/content/Context.html
http://developer.android.com/reference/android/app/Activity.html

y una explicación de la diferencia que tal vez te sea útil acá: http://jarroba.com/context-de-android/

Espero haberte aclarado algo con esta confusa explicación...

Saludos!

0voto

egoitz_gonzalez comentado

Gracias Leonardo.

Saludos.

0voto

Villanuevand comentado

Tremenda respuesta, leonardo-tadei a mí tambien em ayudo.

0voto

Mendez Puntos140

Hola Egoitz.
Me voy a dirigir con tu permiso a Leonardo en la respuesta que ha planteado. Voy a discrepar respecto a su respuesta. Solo soy un alumno de un ciclo superior de programación pero he estado también investigando sobre el tema y, por supuesto, estaré encantado de leer su respuesta en el caso de que no esté deacuerdo.

La diferencia entre Activity y Context es que Context es una clase superior a Activity. Los infladores son propios de la clase Activity por lo tanto el Context no puede inflar. Viendo este esquemita se puede hacer una idea de lo que comento:
java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity
Sin embargo, como bien comenta y siguiendo la jerarquía, desde context se podrá acceder a todos sus métodos pero no a los de Activity, y desde Activity se podrá acceder tanto a los de Context como a los de Activity (lo que viene siendo una herencia, vaya). Conclusión: Para realizar cualquier acción, ( como hacemos en java) es mejor trabajar con la clase que hereda, en este caso "Activity".
Un saludo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta