Android:为什么必须使用getBaseContext()而不是这个
Android:为什么必须使用getBaseContext()而不是这个,android,this,android-context,Android,This,Android Context,此通常用于引用当前上下文。但是,在某些情况下,为什么我们必须使用getBaseContext()而不是this。(这意味着当使用时,此将注意到错误) 以下是我的例子: Spinner spinner = (Spinner) findViewById(R.id.spinner); spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
此
通常用于引用当前上下文。但是,在某些情况下,为什么我们必须使用getBaseContext()
而不是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
}
Spinner-Spinner=(Spinner)findViewById(R.id.Spinner);
旋转器。设置适配器(适配器);
spinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterViewarg0、视图arg1、内部arg2、长arg3){
Toast.makeText(getBaseContext(),“SELECTED”,Toast.LENGTH_SHORT).show();//此行
}
在上面的代码中,当我将getBaseContext()
更改为时,这将收到错误
谁能为我解释一下。在您的示例中,此
指的是新创建的OnItemSelectedListener
而不是任何上下文对象。如果此代码处于活动中,您可以编写YourActivity。此
而不是getBaseContext()
OnItemSelectedListener=新建OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterViewarg0、视图arg1、内部arg2、长arg3){
//this.equals(listener)==true;
//getBaseContext()在这里表示您的活动。this.getBaseContext()
//从外部上下文对象(活动、应用程序、服务)调用getBaseContext()
}
}
OnItemSelected
方法这是指您使用的新的OnItemSelectedListener
实例。
getBaseContext
是您的外部类。如果此代码在活动MyActivity
中,您也可以用MyActivity.this
替换getBaseContext()
这是因为此
引用的是OnItemSelectedListener实例,而不是活动。
getBaseContext()
指的是活动上下文。如果使用此
指的是OnItemSelectedListener
。其接口不是类
。因此它会给您错误,,。如果您在活动中,请始终使用您的ActivityName。此
getApplicationContext()
返回整个应用程序生命周期的应用程序上下文,当应用程序将销毁时,它也将销毁
此
上下文返回活动的当前上下文,属于该活动,该活动将被销毁,然后它也将被销毁。但在您的情况下,它将引用微调器
实例,因为我们在onItemSelected中使用它(AdapterWebArg0,视图arg1,int arg2,长arg3)
来自Spinner
类和Spinner
的方法从AdapterView.OnItemSelectedListener
接口继承此方法
getBaseContext()
是ContextWrapper
的方法,ContextWrapper
是“代理上下文的实现,它只是将所有调用委托给另一个上下文。可以子类化以修改行为而不更改原始上下文。”(根据javadocs)
在您的情况下:Spinner
类不是Context
或ContextWrapper
类的子类*
Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
意思是getBaseContext()
是ContextWrapper
的方法,ContextWrapper
是Context
的代理实现,因此我们间接地传递了一个Context类对象
或者我们也可以传递“Activity.this”,因为Activity
类是ContextWrapper
类的子类
如果使用,则此方法需要上下文类对象:
publicstatictoast-makeText(上下文上下文、int-resId、int-duration)
因此,我们无法将活动或类上下文meansthis
传递给Toast.makeText
,它没有context
或ContextWrapper
类的子类。getBaseContext()有时会混淆android的新用户,相反,用户也可以使用ActivityName,它是您当前工作的活动。因此ActivityName.this将替换getBaseContext()getBaseContext()指的是activity.this
就像我们想在点击按钮时显示Toast一样,我们从不使用它,而是使用Activty.this。这样,我们的Toast会一直显示,直到我们进行相同的活动。
但是如果我们使用getApplicationContext()即使我们切换了活动,Toast也会显示。如果说每个线程都有自己的上下文对象,这是真的吗?
那么,onItemSelectedListener
在UIThread的不同线程上,所以我们不能使用这个
关键字,对吗?1.好的,onItemSelectedListener
在UI线程上。2.它与线程..在onItemSelected()
方法中,当前对象是OnItemSelectedListener
。我问过Sergey同样的问题,如果说每个线程都有自己的上下文对象,这是真的吗?因此,OnItemSelectedListener在UIThread的不同线程上,所以我们不能使用这个关键字,对吗?谢谢:)AFAIKthis
引用您所在的实例。如果您在内部(或匿名)类中,则它引用该内部类。无论您是在线程1还是线程30中。louiscoquio是对的。线程与上下文没有任何关系。“this”引用实例。不要使用getBaseContext()
或getApplicationContext()
除非您确切且明确地知道您使用它的原因。Java新手在进入Android编程之前应该花时间学习Java,这样您就可以学习像OuterClass之类的东西。这
并且当您遇到需要它们时不要感到困惑。@commonware您能给我一个很好的链接吗。(我只知道getBaseContext()
和getApplicationContext
的不同,它会给出错误
Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();