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

谁能为我解释。

最佳答案

  • getApplicationContext ()返回整个应用程序生命周期的应用程序上下文,当应用程序销毁时,它也会销毁。
  • this上下文返回 Activity 的当前上下文,属于该 Activity , Activity 被销毁,然后它也将销毁。但是在您的情况下,它将引用Spinner实例,因为我们在onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)方法中使用了它,它来自Spinner class和SpinnerAdapterView.OnItemSelectedListener接口(interface)
  • 继承此方法
  • getBaseContext()ContextWrapper的方法。 ContextWrapper是,“将上下文的代理实现简单地将所有调用委派给另一个Context。可以在不更改原始Context的情况下被子类化以修改行为。” (根据javadocs)..

  • ,在您的情况下:Spinner类不是ContextContextWrapper类的子类*
    Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
    

    意味着getBaseContext()ContextWrapper的方法,而ContextWrapperContext的代理实现,因此我们间接传递了一个上下文类对象。

    或者我们也可以通过'Activity.this',因为Activity类是ContextWrapper类的子类。

    如果使用android documention,则此方法需要一个Context类对象:public static Toast makeText (Context context, int resId, int duration)
    因此我们无法将 Activity 或类上下文传递给thisToast.makeText,而Context没有ContextWrapper或ojit_code类的子类。

    07-24 09:55