2012-03-07 19 views
24

this a menudo para hacer referencia al contexto actual. Pero, en algún caso, por qué debemos usar getBaseContext() en lugar de this. (Significa que cuando use this notará un error).Android: por qué debe usar getBaseContext() en lugar de este

Aquí está mi ejemplo:

Spinner spinner = (Spinner) findViewById(R.id.spinner); 
spinner.setAdapter(adapter);    
spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){ 
     Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show(); //this line 
    } 

En el código anterior, cuando cambio getBaseContext() a this recibirá error.

Quién puede explicarme, por favor.

+16

No use 'getBaseContext()' o 'getApplicationContext()' a menos que sepa ** exacta y específicamente por qué ** lo está usando. Los recién llegados a Java deberían dedicar un tiempo a aprender Java antes de ingresar a la programación de Android, por lo que aprenderás sobre cosas como 'OuterClass.this' y no te confundas cuando encuentres la necesidad de ellos. – CommonsWare

+2

@CommonsWare me puede dar un buen enlace para esto, por favor. (Solo sé lo diferente de 'getBaseContext()' y 'getApplicationContext' – hqt

+7

http://c2.com/cgi/wiki?InnerClass y http://docs.oracle.com/javase/tutorial/java/javaOO /nested.html y http://juixe.com/techknow/index.php/2009/04/07/java-nested-inner-class-this/ y http://stackoverflow.com/questions/56974/keyword- for-the-outer-class-from-an-anonymous-inner-class – CommonsWare

Respuesta

41
  1. getApplicationContext() devuelve el contexto de aplicación de todo el ciclo de vida de la aplicación, cuando la aplicación destruirá, también destruirá.

  2. this el contexto devuelve el contexto actual de la actividad, pertenecen a la actividad, la actividad se destruye a continuación, se va a destruir also.but en su caso se refiere a la Spinner ejemplo, porque estamos utilizando este método dentro onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3) que es de Spinner clase y Spinner hereda este método de AdapterView.OnItemSelectedListener interfaz

  3. getBaseContext() es el método de ContextWrapper. Y ContextWrapper es decir, "la aplicación La función de proxy de contexto que simplemente delegados todas sus llamadas a otro contexto. Puede ser una subclase de modificar el comportamiento sin cambiar el contexto original." (según javadocs) ..

y, en su caso: Spinner clase no es subclase de Context o ContextWrapper clase *

Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show(); 

significa getBaseContext() se forma de un ContextWrapper d ContextWrapper es la implementación de proxy de Context por lo que indirectamente estamos pasando un objeto de clase de contexto.

o también podemos pasar 'Activity.this' porque la clase Activity es la subclase de la clase ContextWrapper.

si vas con android documention entonces este método requieren un objeto de clase Contexto:
public static Toast makeText (Context context, int resId, int duration)

por lo que no son capaces de pasar de un contexto o una clase de actividad significa this a Toast.makeText que no tienen una subclase de cualquiera Context o ContextWrapper clase.

+2

Pensé que "esto" se refiere a OnItemSelectedListener - no a Spinner. Como en respuesta por Sergey Glotov a continuación. – NineToeNerd

13

En su ejemplo this se refiere a la recién creada OnItemSelectedListener no a ningún objeto de contexto. Si este código está en actividad, puede escribir YourActivity.this en lugar de getBaseContext().

método
OnItemSelectedListener listener = new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){ 
     // this.equals(listener) == true; 

     // getBaseContext() here means YourActivity.this.getBaseContext() 
     // getBaseContext() called from outer context object (activity, application, service) 
    } 
} 
+2

¿Es cierto cuando se dice 'cada hilo tiene su propio objeto de contexto '? Entonces,' onItemSelectedListener' está en un hilo diferente de UIThread, entonces no podemos usar 'this' keywor d, ¿verdad? – hqt

+0

1. AFAIK, 'onItemSelectedListener' está en el hilo de UI. 2. No está relacionado con los hilos. ['this' es una referencia al objeto actual] (http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html). En el método 'onItemSelected()' el objeto actual es 'OnItemSelectedListener'. –

3

OnItemSelected esto se refiere a la nueva OnItemSelectedListener ejemplo que utilizó. getBaseContext es su clase exterior.

+2

misma pregunta que le he preguntado a Sergey, ¿es cierto cuando digo que cada hilo tiene su propio objeto de contexto? Entonces, onItemSelectedListener está en un hilo diferente de UIThread, por lo que no podemos usar esta palabra clave, ¿verdad? Gracias :) – hqt

+1

AFAIK 'this' se refiere a la instancia en la que se encuentra. Si estás en una clase interna (o anónima), se refiere a esa clase interna. No importa si estás en el hilo 1 o 30. – louiscoquio

+0

louiscoquio tiene razón. El hilo no tiene ninguna relación con el contexto. "esto" se refiere a la instancia. – Raz

7

Si este código está en la Actividad MyActivity, también puede reemplazar getBaseContext() por MyActivity.this.

Esto es porque this se refiere a la instancia OnItemSelectedListener, no a la actividad. getBaseContext() se refiere al contexto de la actividad.

3

Si utiliza this refiere OnItemSelectedListener .Y su Interface not Class .so se le da de error ,,, siempre uso si se encuentra en actividad YourActivityName.this

2

getBaseContext() A veces confunde a los recién llegados con Android, en su lugar también se podría usar ActivityName, que es la actividad actual en la que está trabajando. por lo ActivityName.this reemplazarán getBaseContext()

3

getBaseContext() se refiere a Activity.this

como queremos mostrar la tostada al hacer clic con el botón, el usuario nunca utilizamos este Activty.this. Para que nuestro Toast se muestre hasta que estemos en la misma actividad. Pero si usamos getApplicationContext() de lo que nuestro Toast se mostrará incluso cambiamos la actividad.

Cuestiones relacionadas