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
时将收到错误。谁能为我解释。
最佳答案
getApplicationContext ()
返回整个应用程序生命周期的应用程序上下文,当应用程序销毁时,它也会销毁。 this
上下文返回 Activity 的当前上下文,属于该 Activity , Activity 被销毁,然后它也将销毁。但是在您的情况下,它将引用Spinner
实例,因为我们在onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)
方法中使用了它,它来自Spinner
class和Spinner
从AdapterView.OnItemSelectedListener
接口(interface)getBaseContext()
是ContextWrapper
的方法。 ContextWrapper
是,“将上下文的代理实现简单地将所有调用委派给另一个Context。可以在不更改原始Context的情况下被子类化以修改行为。” (根据javadocs).. ,在您的情况下:
Spinner
类不是Context
或ContextWrapper
类的子类* Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
意味着
getBaseContext()
是ContextWrapper
的方法,而ContextWrapper
是Context
的代理实现,因此我们间接传递了一个上下文类对象。或者我们也可以通过'Activity.this',因为
Activity
类是ContextWrapper
类的子类。如果使用android documention,则此方法需要一个Context类对象:
public static Toast makeText (Context context, int resId, int duration)
因此我们无法将 Activity 或类上下文传递给
this
到Toast.makeText
,而Context
没有ContextWrapper
或ojit_code类的子类。