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

hqt*_*hqt 31 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
    }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当我更改getBaseContext()this将收到错误.

请问谁可以帮我解释一下.

ρяσ*_*я K 51

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

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

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

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

Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)

means getBaseContext()是方法,ContextWrapper并且ContextWrapper是Proxying实现,Context所以间接地我们传递一个Context类对象.

或者我们也可以传递'Activity.this',因为Activityclass是类的子ContextWrapper类.

如果你使用android documention,那么这个方法需要一个Context类对象:
public static Toast makeText (Context context, int resId, int duration)

所以我们不能够通过一个活动或类中是指thisToast.makeText不具备的任何一个子类ContextContextWrapper类.

  • 我认为"this"是指OnItemSelectedListener - 而不是Spinner.正如下面谢尔盖格罗托夫的回答. (4认同)

Ser*_*tov 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 说'每个线程都有自己的上下文对象'时是真的吗?所以,`onItemSelectedListener`在UIThread的不同线程上,所以我们不能使用`this`关键字,对吧? (2认同)

lou*_*uio 9

如果此代码在Activity中MyActivity,您也可以替换getBaseContext()MyActivity.this.

这是因为this引用OnItemSelectedListener实例,而不是Activity. getBaseContext()指的是Activity上下文.


Raz*_*Raz 5

OnItemSelectedOnItemSelectedListener方法 this 指的是您使用的 新实例。getBaseContext你是外班吗?

  • 正如我问谢尔盖的问题一样,每个线程都有自己的上下文对象,这是真的吗?所以,onItemSelectedListener是在UIThread的不同线程上,所以我们不能使用这个关键字,对吗?谢谢 :) (2认同)