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()
时会收到错误。
谁能为我解释一下。
-
getApplicationContext ()
返回整个应用程序生命周期的应用程序上下文,当应用程序将销毁它也将销毁。 -
this
上下文返回活动的当前上下文,属于活动,活动被销毁,那么它也会被销毁。但是在你的情况下,它会引用Spinner
实例,因为我们在onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)
中使用了这个onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)
从Spinner
类和Spinner
inheritance此方法的方法AdapterView.OnItemSelectedListener
接口 -
getBaseContext()
是ContextWrapper
的方法。ContextWrapper
是“ 代理上下文的实现,它将所有调用简单地委托给另一个上下文,可以被修改为不改变原始上下文的子类 ”(按照javadocs)。
在你的情况下: Spinner
类不是Context
或ContextWrapper
类的子类*
Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
意思是getBaseContext()
是ContextWrapper
方法,而ContextWrapper
是代理Context
实现,所以间接地传递一个Context Class对象。
或者我们也可以传递'Activity.this',因为Activity
类是ContextWrapper
类的子类。
如果你使用android文档,那么这个方法需要一个Context类对象:
public static Toast makeText (Context context, int resId, int duration)
所以我们不能传递一个活动或类的上下文意味着this
Toast.makeText
没有Context
或ContextWrapper
类的子类。
在你的例子中, this
是指新创build的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) } }
如果此代码位于Activity MyActivity
,则也可以用getBaseContext()
replacegetBaseContext()
。
这是因为this
是指OnItemSelectedListener实例,而不是Activity。 getBaseContext()
引用Activity上下文。
如果你使用this
指的是OnItemSelectedListener
。和它的Interface not Class
.so,它会给你错误,,,如果你在Activity YourActivityName.this
OnItemSelected
方法这是指您使用的新的OnItemSelectedListener
实例。 getBaseContext
是你的外部类。
getBaseContext()引用Activity.this
就像我们想要点击button显示烤面包,我们从来没有用这个我们使用Activty.this。 这样,我们的吐司显示,直到我们在同一个活动。 但是,如果我们使用getApplicationContext()比我们的Toast将显示甚至我们切换活动。
getBaseContext()有时会把新的angular色混淆到android,相反,也可以使用ActivityName,它是你正在工作的当前活动。 所以ActivityName.this将取代getBaseContext()