Android: почему вместо этого следует использовать getBaseContext () - PullRequest
30 голосов
/ 07 марта 2012

this часто для ссылки на текущий контекст. Но, в некоторых случаях, почему мы должны использовать getBaseContext() вместо this. (Это означает, что при использовании this будет замечена ошибка).

Вот мой пример:

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
    }

В приведенном выше коде, когда я изменю getBaseContext() на this, получит ошибку.

Кто мне может объяснить, пожалуйста.

Ответы [ 7 ]

48 голосов
/ 07 марта 2012
  1. getApplicationContext () возвращает контекст приложения всего жизненного цикла приложения, когда приложение будет уничтожено, тогда оно также уничтожит.

  2. this контекст возвращает текущий контекст действия, принадлежит действию, действие уничтожается, затем оно также будет уничтожено. Но в вашем случае оно будет ссылаться на экземпляр Spinner, потому что мы используя этот метод в onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3), который принадлежит классу Spinner и Spinner наследует этот метод от AdapterView.OnItemSelectedListener interface

  3. getBaseContext() - это метод ContextWrapper. И ContextWrapper - это " Реализация прокси для контекста, которая просто делегирует все свои вызовы другому контексту. Может быть разделена на подклассы для изменения поведения без изменения исходного контекста. " (согласно javadocs) ..

и в вашем случае: Spinner класс не является подклассом Context или ContextWrapper класс *

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

означает, что getBaseContext() - это метод ContextWrapper, а ContextWrapper - это прокси-реализация Context, поэтому косвенно мы передаем объект класса контекста.

или мы также можем передать 'Activity.this', потому что Activity class является подклассом ContextWrapper class.

если вы используете документацию для Android , тогда для этого метода требуется объект класса Context:
public static Toast makeText (Context context, int resId, int duration)

, поэтому мы не можем передать действие или контекст класса, значит this в Toast.makeText, у которых нет подкласса Context или ContextWrapper класса.

14 голосов
/ 07 марта 2012

В вашем примере this относится к вновь созданному OnItemSelectedListener, а не к какому-либо объекту контекста. Если этот код активен, вы можете написать YourActivity.this вместо getBaseContext().

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)
    }
}
9 голосов
/ 07 марта 2012

Если этот код в Деятельности MyActivity, вы также можете заменить getBaseContext() на MyActivity.this.

Это потому, что this ссылается на экземпляр OnItemSelectedListener, а не на Activity. getBaseContext() относится к контексту действия.

4 голосов
/ 13 ноября 2013

getBaseContext () ссылается на Activity.this

Как мы хотим показывать тосты по нажатию кнопки, мы никогда не используем это, мы используем Activty.this. Так что наши тосты покажутся, пока мы не будем на одной и той же активности Но если мы используем getApplicationContext (), то наш тост будет отображаться, даже если мы переключим активность.

4 голосов
/ 07 марта 2012

OnItemSelected метод это относится к новому экземпляру OnItemSelectedListener, который вы использовали. getBaseContext это ваш внешний класс.

3 голосов
/ 06 июля 2013

getBaseContext () Иногда путает новичков с android, вместо этого можно также использовать ActivityName, который является текущей активностью, в которой вы работаете. поэтому ActivityName.this заменит getBaseContext ()

3 голосов
/ 07 марта 2012

Если вы используете this относится OnItemSelectedListener. И его Interface not Class. Так что это дает вам ошибку ,,, Всегда используйте, если вы находитесь в деятельности YourActivityName.this

...