Android: зачем использовать getBaseContext() вместо этого

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 будет получена ошибка.

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

Ответ 1

  • getApplicationContext () возвращает контекст приложения всего жизненного цикла приложения, когда приложение уничтожит его, и оно также уничтожит.

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

  • getBaseContext() - метод ContextWrapper. И ContextWrapper: "Проксирование реализации контекста, который просто делегирует все свои вызовы другому Контексту. Может быть подклассифицирован для изменения поведения без изменения исходного контекста". (согласно javadocs)..

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

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

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

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

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

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

Ответ 2

В вашем примере 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)
    }
}

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

getBaseContext() относится к Activity.this

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

Ответ 7

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