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)

    因此,我们无法将活动或类上下文means
    this
    传递给
    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的不同线程上,所以我们不能使用这个关键字,对吗?谢谢:)AFAIK
    this
    引用您所在的实例。如果您在内部(或匿名)类中,则它引用该内部类。无论您是在线程1还是线程30中。louiscoquio是对的。线程与上下文没有任何关系。“this”引用实例。不要使用
    getBaseContext()
    getApplicationContext()
    除非您确切且明确地知道您使用它的原因。Java新手在进入Android编程之前应该花时间学习Java,这样您就可以学习像
    OuterClass之类的东西。这
    并且当您遇到需要它们时不要感到困惑。@commonware您能给我一个很好的链接吗。(我只知道
    getBaseContext()
    getApplicationContext
    的不同,它会给出错误
    Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();