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
时会收到错误。
请为谁解释。
答案 0 :(得分:46)
getApplicationContext ()
返回整个应用程序生命周期的应用程序上下文,当应用程序将销毁时,它也将销毁。
this
上下文返回活动的当前上下文,属于活动,活动被销毁然后它也会被破坏。但在你的情况下,它将引用Spinner
实例,因为我们在来自onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)
类的Spinner
方法中使用此方法而Spinner
从AdapterView.OnItemSelectedListener
接口继承此方法
getBaseContext()
是ContextWrapper
的方法。并且ContextWrapper
是,“代理Context的实现,它简单地将其所有调用委托给另一个Context。可以子类化以修改行为而不改变原始Context。”(根据javadocs)。
,在您的情况下:Spinner
类不是Context
或ContextWrapper
类的子类*
Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
表示getBaseContext()
是ContextWrapper
的方法,而ContextWrapper
是代理Context
的代理,因此我们间接传递了一个Context类对象。
或者我们也可以传递'Activity.this',因为Activity
类是ContextWrapper
类的子类。
如果你使用android documention,那么这个方法需要一个Context类对象:
public static Toast makeText (Context context, int resId, int duration)
因此我们无法将活动或类上下文传递给this
,而Toast.makeText
没有Context
或ContextWrapper
类的子类。< / p>
答案 1 :(得分:14)
在您的示例中,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 :(得分:8)
如果此代码位于活动MyActivity
中,您还可以将getBaseContext()
替换为MyActivity.this
。
这是因为this
引用了OnItemSelectedListener实例,而不是Activity。
getBaseContext()
指的是活动上下文。
答案 3 :(得分:4)
OnItemSelected
方法这指的是您使用的新OnItemSelectedListener
实例。
getBaseContext
你是外族。
答案 4 :(得分:4)
getBaseContext()引用Activity.this
就像我们想要点击按钮显示Toast一样,我们从不使用这个我们使用Activty.this。所以我们的Toast显示,直到我们进行相同的活动。 但是如果我们使用getApplicationContext(),那么即使我们切换活动,也会显示Toast。
答案 5 :(得分:3)
如果您使用this
引用OnItemSelectedListener
。及其Interface not Class
。那么它会给您带来错误,,,如果您处于活动YourActivityName.this
答案 6 :(得分:3)
getBaseContext()有时会将新来者混淆到android,而有人也可以使用ActivityName,它就是你工作的当前活动。所以ActivityName.this将替换getBaseContext()