Android:为什么必须使用getBaseContext()而不是这个

时间:2012-03-07 16:33:44

标签: android this android-context

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

请为谁解释。

7 个答案:

答案 0 :(得分:46)

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

  2. this上下文返回活动的当前上下文,属于活动,活动被销毁然后它也会被破坏。但在你的情况下,它将引用Spinner实例,因为我们在来自onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)类的Spinner方法中使用此方法而SpinnerAdapterView.OnItemSelectedListener接口继承此方法

  3. getBaseContext()ContextWrapper的方法。并且ContextWrapper是,“代理Context的实现,它简单地将其所有调用委托给另一个Context。可以子类化以修改行为而不改变原始Context。”(根据javadocs)。

  4. ,在您的情况下:Spinner类不是ContextContextWrapper类的子类*

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