2012-03-07 3 views
24

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

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

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

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

+16

Не используйте 'getBaseContext()' или 'getApplicationContext()', если вы точно не знаете, и конкретно почему ** вы его используете. Новички на Java должны потратить время на изучение Java, прежде чем попасть в Android-программирование, поэтому вы узнаете о таких вещах, как «OuterClass.this», и не путайте их, когда вы столкнулись с необходимостью для них. – CommonsWare

+2

@CommonsWare, можете ли вы дать мне хорошую ссылку для этого, пожалуйста. (Я просто знаю разные 'getBaseContext()' и 'getApplicationContext' – hqt

+7

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

ответ

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

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

  3. getBaseContext() является метод ContextWrapper. И ContextWrapper есть, «реализация проксирование контексте, что просто делегирует все его звонки в другой контекст. Может быть подклассы, чтобы изменить поведение, не изменяя исходный контекст.» (как в Javadocs) ..

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

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

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

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

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

так что мы не в состоянии передать контекст деятельности или класса означает this к Toast.makeText, которые не имеют подкласс либо Context или ContextWrapper класс.

+2

Я думал, что «это» относится к OnItemSelectedListener - не Spinner. Как в ответе Сергея Глотова ниже. – NineToeNerd

13

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

Действительно ли это, когда говорят, что 'каждый поток имеет свой собственный объект контекста '? Итак,' onItemSelectedListener' находится в другом потоке UIThread, поэтому мы не можем использовать 'this' keywor d, правильно? – hqt

+0

1. AFAIK, 'onItemSelectedListener' находится в потоке пользовательского интерфейса. 2. Он не связан с потоками. ['this' является ссылкой на текущий объект] (http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html). В текущем объекте 'onItemSelected()' 'OnItemSelectedListener'. –

3

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

+2

Тот же вопрос, что и я спросил Сергея, правда ли, когда говорится, что у каждого потока есть собственный объект контекста? Итак, onItemSelectedListener находится в другом потоке UIThread, поэтому мы не можем использовать это ключевое слово, верно? Спасибо :) – hqt

+1

AFAIK 'this' ссылаются на экземпляр, где вы находитесь. Если вы находитесь во внутреннем (или анонимном) классе, это относится к этому внутреннему классу. Независимо от того, находитесь ли вы в нитке 1 или 30. – louiscoquio

+0

louiscoquio является правильным. Нить не имеет никакого отношения к контексту. «this» относится к экземпляру. – Raz

7

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

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

3

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

2

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

3

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

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

Смежные вопросы