2012-03-07 20 views
24

this spesso per fare riferimento al contesto corrente. Ma, in alcuni casi, perché dobbiamo utilizzare getBaseContext() anziché this. (Significa che quando si usa this noterà un errore).Android: perché utilizzare getBaseContext() anziché questo

Ecco il mio esempio:

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 
    } 

Al codice di cui sopra, quando cambio getBaseContext() a this riceverà errore.

Chi può spiegare per me, per favore.

+16

Non utilizzare 'getBaseContext()' o 'getApplicationContext()' a meno che non si sappia ** esattamente e specificamente perché ** lo si sta utilizzando. I neofiti di Java dovrebbero dedicare del tempo ad imparare Java prima di entrare nella programmazione Android, quindi imparerai cose come 'OuterClass.this' e non sarai confuso quando ne incontrerai la necessità. – CommonsWare

+2

@CommonsWare puoi darmi un buon collegamento per questo, per favore. (Sto solo conoscendo il diverso di 'getBaseContext()' e 'getApplicationContext' – hqt

+7

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

risposta

41
  1. getApplicationContext() restituisce il contesto dell'applicazione dell'intero ciclo di vita delle applicazioni, quando l'applicazione distruggerà, distruggerà anche.

  2. this contesto restituisce il contesto attuale delle attività, appartengono all'attività, l'attività viene distrutto allora distruggerà also.but nel vostro caso si fa riferimento all'istanza Spinner perché stiamo usando questo all'interno onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3) metodo che è da Spinner di classe e Spinner ereditano questo metodo da AdapterView.OnItemSelectedListener interfaccia

  3. getBaseContext() è il metodo di ContextWrapper. E ContextWrapper è, "l'attuazione Proxying di Context che semplicemente delega tutte le sue chiamate verso un altro contesto. Può essere sottoclassi per modificare il comportamento senza cambiare il contesto originale." (come da javadocs) ..

e nel tuo caso: Spinner classe non è sottoclasse di Context o ContextWrapper classe *

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

significa getBaseContext() è il metodo di ContextWrapper un d ContextWrapper è l'implementazione di Proxying di Context così indirettamente stiamo passando un oggetto di classe Context.

oppure possiamo anche passare "Activity.this" perché la classe Activity è sottoclasse della classe ContextWrapper.

se si va con android documention allora questo metodo richiede un oggetto di classe Context:
public static Toast makeText (Context context, int resId, int duration)

quindi non sono in grado di superare un contesto di un'attività o di classe significa this a Toast.makeText che non hanno una sottoclasse di entrambi Context o ContextWrapper classe.

+2

Ho pensato "questo" si riferisce a OnItemSelectedListener - non Spinner. Come in risposta di Sergey Glotov di seguito. – NineToeNerd

13

Nell'esempio this si riferisce alla nuova creazione OnItemSelectedListener non a qualsiasi oggetto di contesto. Se questo codice è in attività, è possibile scrivere YourActivity.this anziché getBaseContext().

metodo
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

Fa vero quando dice "ogni thread ha il proprio oggetto contesto '? Quindi,' onItemSelectedListener' si trova su thread differenti di UIThread, quindi non possiamo usare 'this' keywor d, giusto? – hqt

+0

1. AFAIK, 'onItemSelectedListener' si trova nel thread dell'interfaccia utente. 2. Non è correlato ai thread. ['this' è un riferimento all'oggetto corrente] (http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html). Nel metodo 'onItemSelected()' l'oggetto corrente è 'OnItemSelectedListener'. –

3

OnItemSelected questo si riferisce alla nuova OnItemSelectedListener istanza che si è utilizzato. getBaseContext sei classe esterna.

+2

stessa domanda che ho chiesto a Sergey, è vero quando si dice che ogni thread ha il proprio oggetto di contesto? Quindi, onItemSelectedListener si trova su thread differenti di UIThread, quindi non possiamo usare questa parola chiave, giusto? Grazie :) – hqt

+1

AFAIK "questo" si riferisce all'istanza in cui ti trovi. Se sei in una classe interiore (o anonima), si riferisce a quella classe interiore. Non importa se sei nella discussione 1 o 30. – louiscoquio

+0

louiscoquio ha ragione. Il thread non ha alcuna relazione con il contesto. "questo" si riferisce all'istanza. – Raz

7

Se questo codice si trova nell'attività MyActivity, è anche possibile sostituire getBaseContext() per MyActivity.this.

Questo perché this si riferisce all'istanza OnItemSelectedListener, non all'attività. getBaseContext() fa riferimento al contesto di attività.

3

Se si utilizza this riferisce OnItemSelectedListener .E la sua Interface not Class .so è dà nell'inganno ,,, di utilizzare sempre se si è in attività YourActivityName.this

2

Il getBaseContext() A volte confonde i nuovi arrivati ​​in Android, invece si potrebbe usare anche ActivityName, che è l'attività corrente in cui si sta lavorando. così ActivityName.this sostituiranno getBaseContext()

3

getBaseContext() si riferisce a activity.This

come vogliamo mostrare Toast sul click del tasto, non abbiamo mai utente questo usiamo Activty.this. In modo che il nostro Toast si mostri fino a quando non siamo sulla stessa attività. Ma se usiamo getApplicationContext() rispetto al nostro Toast verrà visualizzato anche noi cambiamo l'attività.

Problemi correlati