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()