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()时会收到错误。

谁能为我解释一下。

  1. getApplicationContext ()返回整个应用程序生命周期的应用程序上下文,当应用程序将销毁它也将销毁。

  2. this上下文返回活动的当前上下文,属于活动,活动被销毁,那么它也会被销毁。但是在你的情况下,它会引用Spinner实例,因为我们在onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)中使用了这个onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)Spinner类和Spinnerinheritance此方法的方法AdapterView.OnItemSelectedListener接口

  3. getBaseContext()ContextWrapper的方法。 ContextWrapper是“ 代理上下文的实现,它将所有调用简单地委托给另一个上下文,可以被修改为不改变原始上下文的子类 ”(按照javadocs)。

在你的情况下: Spinner类不是ContextContextWrapper类的子类*

 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没有ContextContextWrapper类的子类。

在你的例子中, 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()